数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址
int main()
{
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16 sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
printf("%d\n",sizeof(a+0));//4 & a[0]
printf("%d\n",sizeof(*a));//4 a[0]
printf("%d\n",sizeof(a+1));//4 &a[1]
printf("%d\n",sizeof(a[1]));//4
printf("%d\n",sizeof(&a));//4 地址
printf("%d\n",sizeof(*&a));//16 &a 整个数组的地址 *(&a) 解引用整个数组
printf("%d\n",sizeof(&a+1));//4 &a[1]
printf("%d\n",sizeof(&a[0]));//4 首元素的地址
printf("%d\n",sizeof(&a[0]+1));//4 &a[1]
char arr[] = {'a','b','c','d','e','f'};
//size_t strlen( const char *string );
printf("%d\n", strlen(arr)); //随机值 假设为x //char *p=arr
printf("%d\n", strlen(arr+0));//x
//printf("%d\n", strlen(*arr));//语法错误 应放char*类型
//printf("%d\n", strlen(arr[1]));//语法错误
//printf("%d\n", strlen(&arr));//语法错误 应放数组指针
//printf("%d\n", strlen(&arr+1));//语法错误 应放数组指针
printf("%d\n", strlen(&arr[0]+1));//x-1
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //7 字符串后面有'\0'
//在二维数组中*(a + i)表示的是第i + 1行0列元素的地址,即a[i][0]的地址。而a + i表示的是第i + 1行的首地址。
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 a[0]+1相当于&(a[0][1]) 地址
printf("%d\n", sizeof( *(a[0] + 1)) );//4
printf("%d\n", sizeof(a + 1)); //4 第二行的地址,a+1是int (*)[4]类型,指向的是数组a的第二行的起始地址;
printf("%d\n", sizeof(*(a + 1))); //16 *(a+1)是int *型,指向的是数组a的第二行第一个元素的地址
printf("%d\n", sizeof(&a[0] + 1)); //4 &a[0]+1相当于(&a[0])+1指针加1寻址到了a[1]
printf("%d\n", sizeof(*(&a[0] + 1))); //16
printf("%d\n", sizeof(*a)); //16 =》a[0]
printf("%d\n", sizeof(a[3])); //16 sizeof 编译期间确定 类型 不参与运算
return 0;
}