C 数组和地址,数组指针

int arr[10];

定义了一个数组arr

arr——(数组名)代表首元素地址 

&arr[0]——也代表首元素地址

&arr——代表数组的地址

上述三个变量的值是相同的,但是第三个和前两个的含义不同。

 

数组名在一般情况下是首元素的地址,但是有两个例外

1. 使用sizeof(arr)求数组长度——此时数组名并不代表首元素地址,而是代表整个数组

2.&arr不代表首元素地址,而是代表整个数组的地址。

如果使用sizeof(&arr),得到的结果是4个字节,因为求的就是这个地址占用的空间大小。

数组指针


int (* arrPtr)[10] = NULL;  // 一个指针,它指向一个有10个int元素的数组
int matrix[3][10];          // 3行,10列的数组
                            // 数组名称是一个指向第一个元素的指针,也就是第一行的指针
arrPtr = matrix;            // 使得arrPtr指向矩阵的第一行
(*arrPtr)[0] = 5;           // 将5赋值给第一行的第一个元素
arrPtr[2][9] = 6;           // 将6赋值给最后一行的最后一个元素
++arrPtr;                   // 将指针移动到下一行
(*arrPtr)[0] = 7;           // 将7赋值给第二行的第一个元素

或者
typedef int ARRAY_t[10];    // 定义一个“具有10个元素数组”类型名称
ARRAY_t  a,                 // 具有该类型的数组
         *arrPtr;           // 一个指向该数组类型的指针
arrPtr = (ARRAY_t *)a;      // 使得arrPtr指向a
数组a,会被隐式地转换为指针,指向数组第一个元素,而不是指向整个数组。指向 int 的指针没有被隐式地转换为指向 int 数组的指针。本例中的赋值操作需要显式的类型转换,在类型转换运算符中明确指定目标类型是:ARRAY_t *
C语言数组指针和指针数组
 
喜欢 0
分享