复习C语言随笔 八
NOTE: 我使用的编译器为64位,所以地址占8个字节
#include<stdio.h>
int main(){
// 一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16 a的长度
printf("%d\n",sizeof(a+0)); //8 a[0]的地址的长度
printf("%d\n",sizeof(*a)); //4 a[0]的长度
printf("%d\n",sizeof(a+1)); //8 a[1]的地址的长度
printf("%d\n",sizeof(a[1])); //4 a[1]的长度
printf("%d\n",sizeof(&a)); //8 a的地址的长度
printf("%d\n",sizeof(*&a)); //16 a的长度
printf("%d\n",sizeof(&a+1)); //8 a的下一份地址空间的地址的长度
printf("%d\n",sizeof(&a[0])); //8 a[0]的地址的长度
printf("%d\n",sizeof(&a[0]+1)); //8 a[1]的地址的长度
return 0;
}
#include<stdio.h>
#include<string.h>
int main(){
//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr)); // 6 arr的长度
printf("%d\n", sizeof(arr+0)); // 8 arr[0]的地址的长度
printf("%d\n", sizeof(*arr)); // 1 a[0]的长度
printf("%d\n", sizeof(arr[1])); // 1 a[1]的长度
printf("%d\n", sizeof(&arr)); // 8 arr的地址的长度
printf("%d\n", sizeof(&arr+1)); // 8 arr的下一份地址空间的地址的长度
printf("%d\n", sizeof(&arr[0]+1)); // 1 arr[1]的地址的长度
printf("%d\n", strlen(arr)); // 随机值
printf("%d\n", strlen(arr+0)); // 随机值
// printf("%d\n", strlen(*arr)); //err 对arr[0]进行strlen操作,导致strlen()函数内部指针越界
// printf("%d\n", strlen(arr[1])); //err 对arr[1]进行strlen操作,导致strlen()函数内部指针越界
printf("%d\n", strlen(&arr)); //随机值 从arr首地址开始,遇到第一个'\0'(不包括'\0')的长度
printf("%d\n", strlen(&arr+1)); //随机值 从arr的下一个地址空间开始,遇到第一个'\0'(不包括'\0')的长度
printf("%d\n", strlen(&arr[0]+1)); //随机值 从arr[1]开始,遇到第一个'\0'(不包括'\0')的长度
char arr[] = "abcdef"; //此处定义字符串,结尾处自动补 '\0 '
printf("%d\n", sizeof(arr)); //7 arr的长度
printf("%d\n", sizeof(arr+0)); // 8 arr[0]的地址的长度
printf("%d\n", sizeof(*arr)); //1 arr[0]的长度
printf("%d\n", sizeof(arr[1])); //1 arr[1]的长度
printf("%d\n", sizeof(&arr)); //8 arr的地址的长度
printf("%d\n", sizeof(&arr+1)); //8 arr的下一个地址空间的地址的长度
printf("%d\n", sizeof(&arr[0]+1)); //8 arr[1]的地址的长度
printf("%d\n", strlen(arr)); //6 arr的长度(不包括'\0')
printf("%d\n", strlen(arr+0)); //6 从arr[0]起到第一个'\0'之间的长度
// printf("%d\n", strlen(*arr)); //errr 对arr[0]进行strlen操作,导致strlen()函数内部指针越界
// printf("%d\n", strlen(arr[1])); //err 对arr[1]进行strlen操作,导致strlen()函数内部指针越界
printf("%d\n", strlen(&arr)); //6 从arr首地址开始,遇到第一个'\0'(不包括'\0')的长度
printf("%d\n", strlen(&arr+1)); //随机值 从arr的下一个地址空间开始,遇到第一个'\0'(不包括'\0')的长度
printf("%d\n", strlen(&arr[0]+1)); //5 从arr[1]开始,遇到第一个'\0'(不包括'\0')的长度
char *p="abcdef";
printf("%d\n", sizeof(p)); //8 指针p所指的字符 'a' 地址的长度
printf("%d\n", sizeof(p+1)); //8 字符 'b' 的地址的长度
printf("%d\n", sizeof(*p)); //1 字符 'a' 的长度
printf("%d\n", sizeof(p[0])); //1 字符 'a' 的长度
printf("%d\n", sizeof(&p)); //8 指针p的地址的长度
printf("%d\n", sizeof(&p+1)); //8 指针p的地址的下一个地址空间的长度
printf("%d\n", sizeof(&p[0]+1)); //8 字符'b'的地址的长度
printf("%d\n", strlen(p)); //6 p所指的字符串的首元素到'\0'(不包括''\0)的长度
printf("%d\n", strlen(p+1)); //5 p所指的字符串的第二个元素到'\0'(不包括''\0)的长度
// printf("%d\n", strlen(*p)); //err 对p所指的字符串的第一个字符'a'进行strlen操作,导致strlen()函数内部指针越界
// printf("%d\n", strlen(p[0])); //err 对p所指的字符串的第一个字符'a'进行strlen操作,导致strlen()函数内部指针越界
printf("%d\n", strlen(&p)); //随机值 从指针p的地址开始,遇到第一个'\0'的长度
printf("%d\n", strlen(&p+1)); //随机值 从指针p的地址的下一个地址空间开始,遇到第一个'\0'的长度
printf("%d\n", strlen(&p[0]+1)); //5 从'b'开始,遇到第一个'\0'的长度
return 0;
#include<stdio.h>
#include<string.h>
int main(){
//⼆维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48 整个二维数组的总长度
printf("%d\n",sizeof(a[0][0])); //4 a[0][0]的长度
printf("%d\n",sizeof(a[0])); //16 第0行的长度
printf("%d\n",sizeof(a[0]+1)); //8 a[0][1]的地址的长度
printf("%d\n",sizeof(a+1)); //8 第1行首元素的地址的长度
printf("%d\n",sizeof(&a[0]+1)); //8 第1行的地址的长度
printf("%d\n",sizeof(*a)); //16 第0行的长度
printf("%d\n",sizeof(a[3])); //16 行的长度
return 0;
}
总结:
数组名代表整个数组的时候只有两种情况:
sizeof(数组名),这⾥的数组名表示整个数组。
&数组名,这⾥的数组名表示整个数组。
数组作为函数参数。