数组、指针的关系
-
常常有同学把数组和指针混为一谈,认为指针和数组是等同的!这样的思维是不对的。
-
数组和指针在某些场景下用法是相同的,但绝对不能说(指针=数组)这种结论,下面将指出它们的区别:
-
在声明数组的时候,编译器同时给数组分配了指定大小的空间,用于容纳数组的元素;而声明一个指针的时候,编译器只分配了容纳指针本身的空间(如64位系统中8个字节)。
-
int arr[10] = {0}; int *p = NULL; ① printf("arr = %d\n", *arr); ② printf("p = %d\n", *p);
使用①打印方式是合法的,对数组的第一个值打印,结果是0;但是②中*p这个操作是非法的,因为 *p这个操作将会访问内存中不确定的位置,会导致段错误。
-
int arr[10] = {0}; int *p = arr; arr++; p++;
p++是一个合法操作,对指针做偏移;但是arr++操作是非法的,因为arr的值是固定的,是一个常量(数组第一个元素的内存地址)。
-
对数组取sizeof操作的时候,sizeof计算的是整个数据的大小;而对指针取sizeof时,是一个指针所占用的字节数,64位系统中是8个字节,固定的值。
-
int arr[10] = {0}; int *p = arr; printf("arr = %p\n", arr); printf("arr = %p\n", &arr); printf("p = %p\n", p); printf("p = %p\n", &p);
上面输出一样么?不一样,但是前两个是一样的地址。对数组名单目操作&返回一个指向数组的指针,而不是一个指向数组第一个元素的指针的指针!
以上就是指针个数组的的区别,本人能力优先,如有错误望各位大佬不吝指正,原创不易,转载请注明出处
-