1、首先数组首元素的地址和数组地址的值是相等的。
2、数组首元素的地址和数组地址是两个不同的概念。
3、举例如下:
#include<stdio.h>
void main() {
int a[10] = {};
printf("%d\n", a);
printf("%d\n", a+1); //与前面一个相差4
printf("%d\n", &a);
printf("%d\n", &a + 1); //与前面一个相差40
}
输出结果如下:
a的值是数组首元素的地址,所以a+1,就是第二个元素的地址,int类型占用4个字节,所以相差4
而&a是整个数组的地址,所以&a+1,就是向后移动(10*4)个单位。所以相差40.
自己的思考:其实a的本质是指针,就像[](中括号)的本质是*一样,所以当a+1的时候,指针向后偏移sizeof(int)的大小。而&a这个时候的a是一个变量。这个变量是int [10].所以&a+1,偏移10*sizeof(int).
int a[10]; //a是一个指针===》a常量指针===》为什么a常量指针
a ++;//不能进行a++
C++编译器要拿着a去析构内存,为了避免你把a的指向改变。
这里还有一个释放内存的知识点:
char * p="abcdefg";
free(p);//释放内存
p==NULL;//避免野指针
但是如果进行了p++以后,free(p);不行了,free释放内存必须从首地址开始。
关注我,让我们一起成长!