我们可以通过数组名+整数的运算,获取到数组每一个元素的地址
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
printf("%p\n", arr + i);
}
数组名+i<==>第i个元素的地址
*(数组名+i)<==> 第i个元素
1.
int a[] = { 1, 2, 3, 4 };
//sizeof单位是字节
printf("%d\n", sizeof(a)); //16 ,sizeof(数组名)表示整个数组
printf("%d\n", sizeof(a+0));//4,首元素的地址+0,还是首元素的地址
printf("%d\n", sizeof(*a));//4,首元素‘1’,int类型
printf("%d\n", sizeof(a+1));//4,第二个元素的地址
printf("%d\n", sizeof(a[1]));//4,第二个元素
printf("%d\n", sizeof(&a));//4,首元素的地址
printf("%d\n", sizeof(&a+1));//4,跳过整个数组的下一个地址
printf("%d\n", sizeof(&a[0]));//4,第一个元素的地址
printf("%d\n", sizeof(&a[0]+1));//4,第二个元素的地址
printf("%d\n", sizeof(*&a));//16,&a是整个数组的地址,解引用访问整个数组
注:
arr+1:第二个元素的地址
&arr+1:跳过整个数组的下一个地址
2.
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr+0));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr+1));//4
printf("%d\n", sizeof(&arr[0]+1));//4
printf("%d\n", sizeof(*&arr));//6
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
//strlen()函数遇到‘/0’结束
printf("%d\n", strlen(arr));//随机值
printf("%d\n", strlen(arr+0));//随机值
//printf("%d\n", strlen(*arr));//访问内存出错,*arr是‘a’
//printf("%d\n", strlen(arr[1]));//访问内存出错,arr[1]是‘b’
printf("%d\n", strlen(&arr));//随机值
printf("%d\n", strlen(&arr+1));//随机值
printf("%d\n", strlen(&arr[0]+1));//从b向后数,随机值
3.
char *p = "abcdef";
printf("%d\n", sizeof(p));//指针,4
printf("%d\n", sizeof(p+1));//4
printf("%d\n", sizeof(*p));//1,a
printf("%d\n", sizeof(p[0]));//1,a
printf("%d\n", sizeof(&p));//4
printf("%d\n", sizeof(&p+1));//4
printf("%d\n", sizeof(&p[0]));//4
char *p="abcdef";
p中存放的‘a’的地址
1)先将“abcdef”放在内存里
2)在向内存申请四字节(p),用来存放地址
3)把a字符的地址放在的p中,每次用时从后向后找
所以sizeof(*p),是1,因为p里面只有a 的地址
char *p = "abcdef";
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p+1));//5
//printf("%d\n", strlen(*p));//错误,*p=‘a’
//printf("%d\n", strlen(p[0]));//错误,p[0] = 'a'
//printf("%d\n", strlen(&p));//随机值
//printf("%d\n", strlen(&p+1));//随机值
printf("%d\n", strlen(&p[0]));//6
printf("%d\n", strlen(&p[0])+1);//随机值
4.
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7,整个数组
printf("%d\n", sizeof(arr + 0));//4,首元素地址+0,还是首元素地址
printf("%d\n", sizeof(*arr));//1,首元素地址解引用,a
printf("%d\n", sizeof(arr[1]));//1,首元素,a
printf("%d\n", sizeof(&arr));//4,地址
printf("%d\n", sizeof(*&arr));//7,整个数组
printf("%d\n", sizeof(&arr + 1));//4,地址
printf("%d\n", sizeof(&arr[0] + 1));//4,地址值
char arr[] = "abcdef";
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr+0));//6
//printf("%d\n", strlen(*arr));//错误'a'
//printf("%d\n", strlen(arr[1]));//错误'b'
printf("%d\n", strlen(&arr));//6
printf("%d\n", strlen(*&arr));//6
printf("%d\n", strlen(&arr+1));//随机值
printf("%d\n", strlen(&arr[0]+1));//5
二维数组:
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48
printf("%d\n", sizeof(a[0][0]));//4
printf("%d\n", sizeof(a[0]));//16
printf("%d\n", sizeof(a[0]+1));//4
printf("%d\n", sizeof(a+1));//4
printf("%d\n", sizeof(&a[0]+1));//4
printf("%d\n", sizeof(*a));//16
printf("%d\n", sizeof(a[3]));//16
a[0]单独放在sizeof内部,表示第一行的地址,(a[0]+1)放在sizeof内部,a[0]发生降级,表示第一行第一个元素的地址,a[0]+1为第一行第二个元素的地址