例一
一般情况下,数组名表示首元素地址,只有在以下的情况中数组名表示整个数组的地址:
1.sizeof(数组名):这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名:这里的数组名表示整个数组,取出的是整个数组的地址。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//a表示整个数组,注意不是整个数组的地址,也就是说不是一个指针变量,所以计算整个数组的大小,而不是指针的大小
printf("%d\n", sizeof(a + 0));//这是下标为0的元素的地址,是个指针,所以是8(32位机器上是4)
printf("%d\n", sizeof(*a));//拿到了a[0]这个元素,是int型
printf("%d\n", sizeof(a + 1));//这是下标为1的元素的地址,是指针
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));//这是整个数组的地址,是一个指针,所以是8.
printf("%d\n",sizeof(*&a));//这是拿到了整个数组,所以是整个数组的大小
printf("%d\n",sizeof(&a+1));//+1是跳过了一整个数组,但本质上还是指针
printf("%d\n",sizeof(&a[0]));//地址,是指针
printf("%d\n",sizeof(&a[0]+1));//下标为1的元素的地址,是指针
return 0;
}
例二
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));//下标为0的元素的地址
printf("%d\n", sizeof(*arr));//得到的是首元素
printf("%d\n", sizeof(arr[1]));//是下标为一的元素
printf("%d\n", sizeof(&arr));//是整个数组的地址,是指针
printf("%d\n", sizeof(&arr+1));//还是指针
printf("%d\n", sizeof(&arr[0]+1));//下标为1的元素的地址,是指针
例三
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));//随机,因为不知道\0在哪里
printf("%d\n", strlen(arr+0));//同上
printf("%d\n", strlen(*arr));//参数有误,strlen的参数是地址
printf("%d\n", strlen(arr[1]));//同上
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));//都不知道\0在哪里
例四
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//别忘了字符串末尾有\0
printf("%d\n", sizeof(arr+0));//首元素地址,指针
printf("%d\n", sizeof(*arr));//首元素
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
注意,常量字符串末尾是\0,这是与字符数组的不同之处
例五
注意strlen的参数是地址,strlen遇到\0就停止计数
char arr[] = "abcdef";//字符串末尾有\0
printf("%d\n", strlen(arr));//传递的是首字符地址,所以从这个地址开始计算长度,直到遇到\0
printf("%d\n", strlen(arr+0));//还是首元素地址
printf("%d\n", strlen(*arr));//参数有误
printf("%d\n", strlen(arr[1]));//同上
printf("%d\n", strlen(&arr));//是整个数组的地址,但和首元素的地址是同一个地址
printf("%d\n", strlen(&arr+1));//是一个地址,跳过了一整个数组,所以是随机值
printf("%d\n", strlen(&arr[0]+1));//这是从第二个字符开始计算,所以是5
例六
注意&p加一表示跳过一个char*(指针变量)的大小,即跳过了8个字节
char *p = "abcdef";
printf("%d\n", sizeof(p));//指针变量的大小
printf("%d\n", sizeof(p+1));//字符b的地址
printf("%d\n", sizeof(*p));//字符a的大小
printf("%d\n", sizeof(p[0]));//同上
printf("%d\n", sizeof(&p));//指针p的地址,是二级指针
printf("%d\n", sizeof(&p+1));//还是地址
printf("%d\n", sizeof(&p[0]+1));//字符a的地址加1,得到字符b的地址
例七
char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));//从b开始计算
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));//其实是随机值,因为&p是p的地址,而不是a的地址,所以肯恰好从p所在地址开始往后6个字符恰好有一个\0
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));