数组名是首元素的地址 唯独这两种情况
1、sizeof(数组名) 此时表示整个数组的长度
2、&数组名 此时表示整个数组的地址
整形数组
#include <stdio.h>
int main()
{
int arr[]={1,2,3,4};
printf("%d\n",sizeof(arr)); //16
printf("%d\n",sizeof(arr+0)); //4/8
printf("%d\n",sizeof(*arr)); //4 首元素的地址解引用就是首元素
printf("%d\n",sizeof(arr+1)); //4/8
printf("%d\n",sizeof(arr[1])); //4
printf("%d\n",sizeof(&arr)); //4/8 &arr 取出的是整个数组的地址,但是整个数组的地址也是地址,地址的大小就是 4/8 字节
printf("%d\n",sizeof(*&arr)); //16 &arr 是数组的地址 数组的地址解引用访问的数组 sizeof计算的就是数组的大小 *与&抵消后 就变成了 数组的大小
printf("%d\n",sizeof(&arr+1)); //4/8
printf("%d\n",sizeof(&arr[0])); //4/8
printf("%d\n",sizeof(&arr[0]+1)); //4/8
return 0;
}
字符数组
#include <stdio.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr)); //6
printf("%d\n", sizeof(arr+0)); //4/8 arr是首元素的地址 arr+0 还是地址
printf("%d\n", sizeof(*arr)); //1 首元素
printf("%d\n", sizeof(arr[1])); //1
printf("%d\n", sizeof(&arr)); //4/8 数组的地址还是地址
printf("%d\n", sizeof(&arr+1)); //4/8
printf("%d\n", sizeof(&arr[0]+1)); //4/8
printf("%d\n", strlen(arr)); //随机值 遇到0结束
printf("%d\n", strlen(arr+0)); //随机值
printf("%d\n", strlen(*arr)); //err strlen 需要的是一个地址 *arr相当于数组名解引用 数组名就是首元素 首元素地址解引用就是首元素 ‘a’的 ASCII为 97 它就会把97当成地址 就变成了非法访问
printf("%d\n", strlen(arr[1])); //err
printf("%d\n", strlen(&arr)); //随机值
printf("%d\n", strlen(&arr+1)); //随机值-6
printf("%d\n", strlen(&arr[0]+1)); //随机值-1
return 0;
}
#include <stdio.h>
int main()
{
char arr[] = "abcdef"; //arr 实际的内容为 a b c d e f \0
printf("%d\n", sizeof(arr)); //7
printf("%d\n", sizeof(arr+0)); //4/8 首元素的地址+0 还是地址
printf("%d\n", sizeof(*arr)); //1
printf("%d\n", sizeof(arr[1])); //1
printf("%d\n", sizeof(&arr)); //4/8
printf("%d\n", sizeof(&arr+1)); //4/8
printf("%d\n", sizeof(&arr[0]+1)); //4/8
printf("%d\n", strlen(arr)); //6
printf("%d\n", strlen(arr+0)); //6
printf("%d\n", strlen(*arr)); //err
printf("%d\n", strlen(arr[1])); //err
printf("%d\n", strlen(&arr)); //6
printf("%d\n", strlen(&arr+1)); //随机值
printf("%d\n", strlen(&arr[0]+1)); //5
return 0;
}
指针变量
#include <stdio.h>
int main()
{
char* p = "abcdef";
printf("%d\n", sizeof(p)); //4/8 计算的是指针变量p的大小
printf("%d\n", sizeof(p+1)); //4/8 计算的是字符b的地址
printf("%d\n", sizeof(*p)); //1 首元素
printf("%d\n", sizeof(p[0])); //1 p[0]==*(p+0)
printf("%d\n", sizeof(&p)); //4/8 取出的是p的地址
printf("%d\n", sizeof(&p+1)); //4/8 只要是地址就是 4/8
printf("%d\n", sizeof(&p[0]+1)); //4/8
printf("%d\n", strlen(p)); //6 遇到0结束 不包括0
printf("%d\n", strlen(p+1)); //5
printf("%d\n", strlen(*p)); //err strlen 需要的是地址
printf("%d\n", strlen(p[0])); //err
printf("%d\n", strlen(&p)); //随机值 因为它取决于p存放的内容
printf("%d\n", strlen(&p+1)); //随机值
printf("%d\n", strlen(&p[0]+1)); //5
return 0;
}
二维数组
#include <stdio.h>
int main()
{
int arr[3][4] = { 0 };
printf("%d\n", sizeof(arr)); //48
printf("%d\n", sizeof(arr[0][0])); //4
printf("%d\n", sizeof(arr[0])); //16 如果是单独的 arr[0] 放进sizeof 就计算的是一整行的大小
printf("%d\n", sizeof(arr[0]+1)); //4/8 此时arr[0]没有单独放 就代表首元素的地址 地址+1还是地址
printf("%d\n", sizeof(*(arr[0]+1))); //4 第一行第二个元素
printf("%d\n", sizeof(arr+1)); //4/8 arr代表首元素的地址 arr+1代表第二行的地址
printf("%d\n", sizeof(*(arr+1))); //16 第二行的地址解引用就是第二行的大小 sizeof(arr[1])
printf("%d\n", sizeof(&arr[0]+1)); //4/8 第二行的地址
printf("%d\n", sizeof(*(&arr[0]+1))); //16 第二行的地址解引用就是第二行的大小
printf("%d\n", sizeof(*arr)); //16 arr是首元素的地址 sizeof(*arr) 就是计算第一行的大小
printf("%d\n", sizeof(arr[3])); //16 sizeof内部的表达式不参与实际的运算,只根据其类型的大小 arr[3]==arr[2]==arr[1]==arr[0]
return 0;
}
指针的大小是 4/8
地址的大小是 4/8
都取决于32位的电脑还是64位的电脑
详情 指针的大小