目录
1.一维数组
#include<stdio.h>
#include<string.h>
int main()
{
//一维数组
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16 计算a数组的字节数
printf("%d\n", sizeof(a + 0));//4\8 a+0表示a[0]的地址,计算地址字节数
printf("%d\n", sizeof(*a));//4 *a表示对数组a首地址解引用,得到数组a[0]的内容,计算a[0]的字节数
printf("%d\n", sizeof(a + 1));//4\8 a+1表示a[1]的地址,计算地址字节数
printf("%d\n", sizeof(a[1]));//4 计算a[1]的字节数
printf("%d\n", sizeof(&a));//4\8 &a表示整个数组a的地址,计算地址字节数
printf("%d\n", sizeof(*&a));//16 *&a表示对数组a的地址进行解引用,得到整个数组的内容,计算整个数组a内容的字节数,4*4=16
printf("%d\n", sizeof(&a + 1));//4\8 &a+1表示对整个数组a地址加1的跨度,跨度的大小取决于目标的类型,目标为类型为int [4],因此跨度为4*4=16,计算目标为a[3]后4个字节的地址,计算地址字节
printf("%d\n", sizeof(&a[0]));//4\8 计算a[0]的地址
printf("%d\n", sizeof(&a[0] + 1));//4\8 &a[0]+1表示对a[0]地址加1的int字节数,得到a[1]的地址,计算地址字节
return 0;
}
验证:
2.字符数组(1)
#include<stdio.h>
#include<string.h>
int main()
{
//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6 sizeof(arr)表示计算arr整个数组的字节数
printf("%d\n", sizeof(arr + 0));//4\8 arr+0 表示arr数组首地址加0,得到a[0]的地址,计算地址字节数
printf("%d\n", sizeof(*arr));//1 *arr表示对arr数组首地址解引用,得到a[0]的内容,计算a[0]的字节数
printf("%d\n", sizeof(arr[1]));//1 计算arr[1]的字节数
printf("%d\n", sizeof(&arr));//4\8 &arr表示取arr整个数组的地址,计算地址字节数
printf("%d\n", sizeof(&arr + 1));//4\8 &arr+1表示对arr整个数组的地址加1个int [6]类型的字节数,int [6]的字节数为1*6=6,可以理解为跨过arr数组后的地址,计算地址字节数
printf("%d\n", sizeof(&arr[0] + 1));//4\8 &arr[0]+1表示对arr[0]取地址,再加上1个int类型的字节数,得到a[1]的地址,计算地址字节数
printf("%d\n", strlen(arr));//随机数 传入arr首地址,计算从传入地址到'\0'之间的字符数
printf("%d\n", strlen(arr + 0));//随机数 arr+0表示数组arr的首地址加0字节,计算从arr[0]到'\0'之间的字符数
printf("%d\n", strlen(&arr));//随机值 传入arr整个数组的地址,计算从a[0]地址到'\0'之间的字符数
printf("%d\n", strlen(&arr + 1));//随机值 &arr+1表示在arr整个数组之后的地址(arr[5]地址加char类型的字节数),计算从传入地址到'\0'之间的字符数
printf("%d\n", strlen(&arr[0] + 1));//随机值 &arr[0]+1表示在取arr[0]的地址加1个char类型的字节数,得到a[1]的地址,计算地址字节数
printf("%d\n", strlen(*arr));//错误代码 *arr表示对arr数组首地址进行解引用,得到a[0]的内容,'a'对应ASCII码表数值97,将97作为地址传入,非法访问地址
printf("%d\n", strlen(arr[1]));//错误代码 将arr[1]的内容'b’(对应ASCII码表中的数值98)作为地址传入,非法访问地址
return 0;
}
验证:
3.字符数组(2)
#include<stdio.h>
#include<string.h>
int main()
{
//字符数组
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//7 计算arr整个数组的字节数,7*1=7('abcdef\0'),注意整个arr数组包括结尾的'\0'
printf("%d\n", sizeof(arr + 0));//4\8 arr+0表示arr首地址(arr[0]的地址)加0字节,计算a[0]地址字节数
printf("%d\n", sizeof(*arr));//1 *arr表示对arr首地址解引用,得到arr[0],计算arr[0]的字节数
printf("%d\n", sizeof(arr[1]));//1 计算arr[1]的字节数
printf("%d\n", sizeof(&arr));//4\8 计算arr整个数组地址的字节数(与arr[0]地址一样)
printf("%d\n", sizeof(&arr + 1));//4\8 &arr+1表示对取arr整个数组的地址,加1个char [7]类型的字节数(1*7=7),计算地址字节数
printf("%d\n", sizeof(&arr[0] + 1));//4\8 对arr[0]取地址,加1个char类型的字节数,得到arr[1]的地址,计算地址字节数
printf("%d\n", strlen(arr));//6 传入arr数组首地址(arr[0]的地址),计算arr[0]地址到'\0'之间的字符数
printf("%d\n", strlen(arr + 0));//6 arr+0表示arr[0]地址加0字节,计算arr[0]地址到'\0'之间的字符数
printf("%d\n", strlen(&arr));//6 &arr表示取arr整个数组的地址(与arr[0]地址一样),计算arr[0]地址到'\0'之间的字符数
printf("%d\n", strlen(&arr + 1));//随机值 &arr+1表示对取arr整个数组的地址,加1个char [7]类型的字节数(1*7=7),计算arr数组的'\0'的后一位字符到下一个'\0'之间的字符数
printf("%d\n", strlen(&arr[0] + 1));//5 &arr[0]+1表示对arr[0]取地址,加1个char类型的字节数,得到arr[1]的地址,计算arr[1]到'\0'之间的字符数
printf("%d\n", strlen(*arr));//错误代码 对arr首地址解引用,得到arr[0]的内容'a'('a'对应ASCII码表数值97),将97作为地址传入,非法访问地址
printf("%d\n", strlen(arr[1]));//错误代码 arr[1]的内容'b'('b'对应ASCII码表数值98),将98作为地址传入,非法访问地址
return 0;
}
验证:
4. 字符数组(3)
#include<stdio.h>
#include<string.h>
int main()
{
//字符数组
char* p = "abcdef";
printf("%d\n", sizeof(p));//4\8 计算指针p指向地址的字节数 计算地址的字节数
printf("%d\n", sizeof(p + 1));//4\8 p+1表示指针p指向地址,加1个char类型的字节数,得到"abcdef"中"b"的地址,计算地址的字节数
printf("%d\n", sizeof(*p)); //1 *p表示对指针p指向地址进行解引用,得到"a",计算"a"的字节数
printf("%d\n", sizeof(p[0]));//1 计算"a"的字节数
printf("%d\n", sizeof(&p));//4\8 &p表示取p指针的地址,计算地址的字节数
printf("%d\n", sizeof(&p + 1));//4\8 &p+1表示对取p指针的地址,加1个char类型的字节数,计算地址的字节数
printf("%d\n", sizeof(&p[0] + 1));//4\8 &p[0]+1表示对取"a"的地址,加1个char类型的字节数(数组中的"b"的地址),计算地址的字节数
printf("%d\n", strlen(p));//6 传入指针p指向的地址,计算从字符数组"a"开始到"\0"之间的字符数
printf("%d\n", strlen(p + 1));//5 传入指针p指向的地址,加1个char类型字节数,计算从字符数组"b"开始到"\0"之间的字符数
printf("%d\n", strlen(&p));//随机值 &p表示取指针p的地址,计算从指针p的地址开始到"\0"之间的字符数
printf("%d\n", strlen(&p + 1));//随机值 &p+1表示取指针p的地址,加1个char类型的字节数,计算从指针p后一字节的地址开始到"\0"之间的字符数
printf("%d\n", strlen(&p[0] + 1));//5 &p[0]+1表示对p[0]取地址(取字符数组中"a"的地址),加一个char类型的字节数,计算从字符数组"b"开始到"\0"之间的字符数
printf("%d\n", strlen(*p));//错误代码 *p表示对p指针解引用,得到内容'a'('a'对应ASCII码表数值97),将97作为地址传入,非法访问地址
printf("%d\n", strlen(p[0]));//错误代码 p[0]的内容为'a'('a'对应ASCII码表数值97),将97作为地址传入,非法访问地址
return 0;
}
验证:
5.二维数组
#include<stdio.h>
#include<string.h>
int main()
{
//二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48 计算整个数组a中的字节数,(3*4)*4 = 48
printf("%d\n", sizeof(a[0][0]));//4 计算a[0][0]的字节数
printf("%d\n", sizeof(a[0]));//16 计算a[0]行的字节数,4*4 = 16
printf("%d\n", sizeof(a[0] + 1));//4\8 a[0]+1表示在a[0]的首地址加1个int类型字节数,计算a[0][1]地址的字节数
printf("%d\n", sizeof(*(a[0] + 1)));//4 *(a[0]+1)表示对a[1]进行解引用,得到a[1][0],计算a[1][0]的字节数
printf("%d\n", sizeof(a + 1));//4\8 a+1表示取a的首地址(第一行的地址),加1行就是数组a第二行的地址
printf("%d\n", sizeof(*(a + 1)));//16 *(a + 1)表示对数组a第二行地址解引用,得到第二行的内容,计算数组a第二行的字节数
printf("%d\n", sizeof(&a[0] + 1));//4\8 &a[0]+1表示取a[0]整行的地址,加1就是取a[1]整行的地址,计算地址的字节数
printf("%d\n", sizeof(*(&a[0] + 1)));//16 *(&a[0] + 1)就是对a[1]整行的地址解引用,得到a[1]整行的内容,计算数组a第二行的字节数
printf("%d\n", sizeof(*a));//16 *a表示对数组a的首行解引用,得到a[0]整行的内容,计算数组a第一行的字节数
printf("%d\n", sizeof(a[3]));//16 计算a[3]行的字节数,4*4 = 16
return 0;
}
验证: