目錄
- 1. 陣列名轉化為指標
- 2. 陣列下標訪問與指標訪問
- 3. 陣列地址與陣列首元素地址
int a[10]; // array of int of size 10, aka int [10]
int * pa; // pointer-to-int
pa = a; // same as: pa = &a[0]
在大多數語境下,C和C++把陣列名解讀為陣列首元素的地址,所以a和&a[0]都等價于陣列首元素地址,
1. 陣列名轉化為指標
陣列名和指標的一個區別是:指標是變數,pa = a和pa++是合法的;然而陣列名不是變數,而是常量constant,a = pa和a++是非法的,當陣列名傳入函式時,傳入的實際上是陣列首元素的地址,所以陣列名引數是指標,即包含地址的變數,陣列名轉化為指標后,型別也由int [10]即array of int轉變為pointer-to-int,轉變前后sizeof函式回傳不同數值(見如下代碼示例),即為二者之間的第二個不同點:對陣列名執行sizeof運算得到的是陣列的大小,而對指標執行sizeof運算得到的是指標變數的大小,
#include <stdio.h>
void func(int a[]); // function prototype
int main(int argc, char const *argv[]) {
int a[10]; // array of int of size 10
int * pa; // pointer-to-int
pa = a;
printf("size of an array : %lu\n", sizeof(a));
printf("size of a pointer: %lu\n", sizeof(pa));
printf("Enter a function...\n");
func(a);
return 0;
}
void func(int *a) {
printf("size of a pointer: %lu\n", sizeof(a));
}
輸出
size of an array : 40
size of a pointer: 8
Enter a function...
size of a pointer: 8
作為形參,int a[]和int *a是等價的,后者明確說明變數是一個指標,
2. 陣列下標訪問與指標訪問
陣列下標運算式a[i]和指標加偏移*(a + i)運算式是等價的,指標版本的通常更快,在評估a[i]時,C和C++立即將其轉化為*(a + i),a[i]的意思是從指標a所指位置開始,向后移動i個位置,將該位置元素讀出,
3. 陣列地址與陣列首元素地址
雖然通常將陣列名解讀為陣列首元素地址,但是對陣列名執行地址運算&得到的是整個陣列的地址1(見以下代碼示例),
#include <stdio.h>
int main(int argc, char const *argv[]) {
int a[10]; // array of int of size 10, aka int [10]
int * pa; // pointer-to-int
pa = a; // same as: pa = &a[0]
printf("size of int: %lu\n", sizeof(int));
printf("Address of the first element of an array a or &a[0]: %p\n", a);
printf("Address of an array &a : %p\n", &a);
printf(" a + 1: %p\n", a + 1);
printf("&a + 1: %p\n", &a + 1);
return 0;
}
輸出
size of int: 4
Address of the first element of an array a or &a[0]: 0x7ffeeb62b9b0
Address of an array &a : 0x7ffeeb62b9b0
a + 1: 0x7ffeeb62b9b4
&a + 1: 0x7ffeeb62b9d8
數字上二者是相同的,但是概念上,a或者&a[0]是4B大小記憶體塊的地址,而&a是40B大小記憶體塊的地址,所以,運算式a + 1將地址數值加4,運算式&a + 1將地址數值加40,換句話說,a或者&a[0]的型別是pointer-to-int或int *,而&a的型別是pointer-to-array-of-10-int或int (*) [10],這種型別指標的宣告和初始化舉例如下:
// operator [] has higher precedence than operator *
int (*pa1)[10]; // pa1 pointer-to-int[10]
int *pa2[10]; // pa2 pointer-to-int*
typedef int * pint;
pint pa3[10]; // same as pa2
C++ Primer Plus 6th Edition by Stephen Prata ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/258782.html
標籤:區塊鏈
上一篇:go中的RPC
下一篇:【執行緒、鎖】AQS和ReentrantLock可以回應中斷嗎? --lockInterruptibly()&cancelAcquire()
