一、知识点
数组名代表整个数组的时候只有两种情况:
sizeof(数组名)
&数组名
二、相关运算题
1. 整形数组
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a)); //a表示整个数组,计算的是整个数组的字节大小---16
printf("%d\n", sizeof(a + 0)); //a+0表示数组首元素的地址---4
printf("%d\n", sizeof(*a)); //*a <=> *(a+0) <=> a[0],表示数组首元素(int)---4
printf("%d\n", sizeof(a + 1)); //a+1表示数组第二个元素的地址---4
printf("%d\n", sizeof(a[1])); //a[1]表示数组第二个元素(int)---4
printf("%d\n", sizeof(&a)); //&a表示整个数组的地址---4
printf("%d\n", sizeof(*&a)); //*&a表示整个数组,计算的是整个数组的字节大小---16
printf("%d\n", sizeof(&a + 1)); //&a表示整个数组的地址,&a+1表示跳过整个数组,整个数组后面那块空间的起始地址---4
printf("%d\n", sizeof(&a[0])); //&a[0]表示数组首元素的地址---4
printf("%d\n", sizeof(&a[0] + 1)); //&a[0]+1表示数组第二个元素的地址---4
2. 字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); //arr表示整个数组,计算的是整个数组的字节大小---6
printf("%d\n", sizeof(arr+0)); //arr+0表示数组首元素的地址---4
printf("%d\n", sizeof(*arr)); //*arr表示首元素(char)---1
printf("%d\n", sizeof(arr[1])); //arr[1]表示数组第二个元素(char)---1
printf("%d\n", sizeof(&arr)); //&arr表示整个数组的地址---4
printf("%d\n", sizeof(&arr+1)); //&arr表示整个数组的地址,&arr+1表示跳过整个数组,整个数组后面那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0]+1)); //&arr[0]+1表示数组第二个元素的地址---4
printf("%d\n", strlen(arr)); //从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(arr + 0)); //从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(*arr)); //*arr表示首元素('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(arr[1])); //arr[1]表示数组第二个元素('b'--98),98这个地址不允许访问---error
printf("%d\n", strlen(&arr)); //从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(&arr + 1)); //跳过整个数组,从'f'后开始数,'f'的后面未知---随机值,与上面差6
printf("%d\n", strlen(&arr[0] + 1)); //从'b'开始数,'f'的后面未知---随机值,与上上面差1
3. 字符串数组
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //arr表示整个数组,计算的是整个数组的字节大小,其中该数组包含'\0'---7
printf("%d\n", sizeof(arr + 0)); //arr+0表示数组首元素的地址---4
printf("%d\n", sizeof(*arr)); //*arr表示首元素(char)---1
printf("%d\n", sizeof(arr[1])); //arr[1]表示数组第二个元素(char)---1
printf("%d\n", sizeof(&arr)); //&arr表示整个数组的地址---4
printf("%d\n", sizeof(&arr + 1)); //跳过整个数组,整个数组后面(即'\0'后面)那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0] + 1)); //&arr[0]+1表示数组第二个元素的地址---4
printf("%d\n", strlen(arr)); //从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(arr + 0)); //从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(*arr)); //*arr表示首元素('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(arr[1])); //arr[1]表示数组第二个元素('b'--98),98这个地址不允许访问---error
printf("%d\n", strlen(&arr)); //从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(&arr + 1)); //跳过整个数组,从'\0'后开始数,'\0'的后面未知---随机值
printf("%d\n", strlen(&arr[0] + 1)); //从'b'开始数,'f'的后面遇见'\0'---5
4. 字符串指针
char *p = "abcdef";
printf("%d\n", sizeof(p)); //p是一个指针变量,为一个地址---4
printf("%d\n", sizeof(p + 1)); //p+1是'b'的地址---4
printf("%d\n", sizeof(*p)); //p是一个字符指针,解引用后就是一个字符---1
printf("%d\n", sizeof(p[0])); //p[0] <=> *(p+0) <=> *p ---1
printf("%d\n", sizeof(&p)); //&p是p的地址---4
printf("%d\n", sizeof(&p + 1)); //跳过p,p后面那段空间的起始地址---4
printf("%d\n", sizeof(&p[0] + 1)); //&p[0]+1是'b'的地址---4
printf("%d\n", strlen(p)); //从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(p + 1)); //从'b'开始数,'f'的后面遇见'\0'---5
printf("%d\n", strlen(*p)); //*p表示字符'a'('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(p[0])); //p[0]表示字符'a'('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(&p)); //&p是p的地址,该地址上存储的内容是字符串“abcdef”的首地址,将这个地址值转换成一个个字符开始往后数,直到遇见'\0'---随机值
printf("%d\n", strlen(&p + 1)); //&p+1是p后面那段空间的起始地址,该地址上存储的内容是未知的---随机值
printf("%d\n", strlen(&p[0] + 1)); //从'b'开始数,'f'的后面遇见'\0'---5
5. 二维整形数组
int a[3][4] = {0};
printf("%d\n", sizeof(a)); //a表示整个数组,计算的是整个数组的字节大小---48
printf("%d\n", sizeof(a[0][0])); //a[0][0]表示整个数组的第一个元素(int)---4
printf("%d\n", sizeof(a[0])); //a[0]是二维数组首元素(有4个元素的一维数组)的数组名,表示整个一维数组,计算的是整个一维数组的字节大小---16
printf("%d\n", sizeof(a[0] + 1)); //这里的a[0]表示a[0][0]的地址,则a[0]+1表示a[0][1]的地址---4
printf("%d\n", sizeof(a + 1)); //这里的a是二维数组首元素(有4个元素的一维数组)的地址,即一维数组a[0]的地址,则a+1是下一个一维数组的地址(a[1]的地址)---4
printf("%d\n", sizeof(&a[0] + 1)); //&a[0]是二维数组首元素(有4个元素的一维数组)的地址,即一维数组a[0]的地址,则&a[0]+1是下一个一维数组的地址(a[1]的地址)---4
printf("%d\n", sizeof(*a)); //*a <=> *(a+0) <=> a[0],是二维数组首元素(有4个元素的一维数组)的数组名,表示整个一维数组,计算的是整个一维数组的字节大小---16
printf("%d\n", sizeof(a[3])); //不用访问,由类型(一维数组)可得---16