新绛网站建设,成都旅游公司哪家好,wordpress 主题安全建设,商城网站开发费用一般是多少相关阅读
C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆#xff0c;或者笼统地被称为数组指针#xff0c;但它们之间是有差别的#xff0c;本文就将对此进行讨论。 下面的代码…相关阅读
C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆或者笼统地被称为数组指针但它们之间是有差别的本文就将对此进行讨论。 下面的代码首先创建了一个数组然后创建了指向该数组的指针和指向该数组首元素的指针。
int arr[] {0,1,2};
int *ptr0 arr; //创建了一个int型指针指针值为数组首元素地址
int *ptr1 arr[0]; //创建了一个int型指针指针值为数组首元素地址
int (*ptr2) arr; //创建了一个int型数组指针指针值为整个数组的地址 上面的三个指针其实指针值都是一样的即三个常量arrarr[0]arr尽管这看起来有点奇怪那他们有什么区别呢
arr[0]与arr对于编译器来说没有任何区别因此ptr0和ptr1两个指针的各种性质都是一样的。arr这个常量值虽然与其他两者相同但是对编译器而言它代表了整个数组的地址因此当arr与其他数加减时会将其他数转化为以数组的字节数为单位的地址值对于指针ptr2来说也是如此。
int arr[] {0,1,2};
//下面两条语句等价
int *ptr0 arr; //创建了一个int型指针指针值为数组首元素地址
int *ptr1 arr[0]; //创建了一个int型指针指针值为数组首元素地址
int (*ptr2) [3] arr; //创建了一个int型数组指针指针值为整个数组的地址printf(arr is %p\n, arr);
printf(arr 1 is %p\n, arr 1);
printf(arr[0] is %p\n, arr[0]);
printf(arr[0] 1 is %p\n, arr[0] 1);
printf(arr is %p\n, arr);
printf(arr 1 is %p\n, arr 1);printf(ptr0 is %p\n, ptr0);
printf(ptr0 1 is %p\n, ptr0 1);
printf(ptr1 is %p\n, ptr1);
printf(ptr1 1 is %p\n, ptr1 1);
printf(ptr2 is %p\n, ptr2);
printf(ptr2 1 is %p\n, ptr2 1);输出
arr is 000000000061FDFC
arr 1 is 000000000061FE00
arr[0] is 000000000061FDFC
arr[0] 1 is 000000000061FE00
arr is 000000000061FDFC
arr 1 is 000000000061FE08
ptr0 is 000000000061FDFC
ptr0 1 is 000000000061FE00
ptr1 is 000000000061FDFC
ptr1 1 is 000000000061FE00
ptr2 is 000000000061FDFC
ptr2 1 is 000000000061FE08可以看到arr、arr[0]、arr、ptr0、ptr1、ptr2的值都是相同的但是arr、arr[0]、ptr0、ptr1加1在编译后对地址值加了4因为int类型占4字节的空间arr、ptr2加1在编译后对地址值加了12因为数组含有三个int类型的数据因此数组占12字节的空间。 指向数组的指针在使用多维数组时常见如下所示。
int arr[2][2] {{0,1},{2,3}}; //创建一个多维数组int (*ptr0) [2][2] arr; //创建了一个int型二维数组指针指针值为二维数组的地址
//下面两条语句等价
int (*ptr1) [2] arr; //创建了一个int型一维数组指针指针值为两个数组中第一个数组的地址
int (*ptr2) [2] arr[0]; //创建了一个int型一维数组指针指针值为两个数组中第一个数组的地址
int *ptr3 arr[0]; //创建了一个int型指针指针值为两个数组中第一个数组的首元素地址
int *ptr4 arr[0][0]; //创建了一个int型指针指针值为两个数组中第一个数组的首元素地址printf(ptr0 is %p\n, ptr0);
printf(ptr0 1 is %p\n, ptr0 1);
printf(ptr1 is %p\n, arr[0]);
printf(ptr1 1 is %p\n, ptr1 1);
printf(ptr2 is %p\n, ptr2);
printf(ptr2 1 is %p\n, ptr2 1);
printf(ptr3 is %p\n, ptr3);
printf(ptr3 1 is %p\n, ptr3 1);
printf(ptr4 is %p\n, ptr4);
printf(ptr4 1 is %p\n, ptr4 1);输出
ptr0 is 000000000061FDE0
ptr0 1 is 000000000061FDF0
ptr1 is 000000000061FDE0
ptr1 1 is 000000000061FDE8
ptr2 is 000000000061FDE0
ptr2 1 is 000000000061FDE8
ptr3 is 000000000061FDE0
ptr3 1 is 000000000061FDE4
ptr4 is 000000000061FDE0
ptr4 1 is 000000000061FDE4 可以看到即使ptr0、ptr1、ptr2、ptr3的值都是一样的ptr01在编译后对地址值加了16二维数组占4个字节空间ptr11和ptr21在编译后对地址值加了8一维数组占8个字节空间ptr31在编译后对地址值加了4int类型占4个字节空间。 相信通过本文读者应该对指向数组的指针和指向数组元素的指针有了充分的认识并可以在之后的编程中得心应手的运用指针了。