C语言
1.sizeof语句( 简单逻辑的嵌套 )
sizeof(&a) &a是一个指针变量,大小是4或者8
&a+1也还是地址,
sizeof(arr)和sizeof(arr+1) sizeof里面如果只有数组名,则表示一整个数组,如果不是(进行了运算)那就代表首元素
二维数组同理sizeof(arr[0]) != sizeof(arr[0]+0)
int main()
{
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
//a[0]是第一行这个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组
//sizeof(a[0])计算的就是第一行的大小
printf("%d\n", sizeof(a[0] + 1));//4/8
//a[0]并没有单独放在sizeof内部,也没取地址,a[0]就表示首元素的地址
//就是第一行这个一维数组的第一个元素的地址,a[0] + 1就是第一行第二个元素的地址
printf("%d\n", sizeof(*(a[0] + 1)));//4
//a[0] + 1就是第一行第二个元素的地址
//*(a[0] + 1))就是第一行第二个元素
printf("%d\n", sizeof(a + 1));//4/8
//a虽然是二维数组的地址,但是并没有单独放在sizeof内部,也没取地址
//a表示首元素的地址,二维数组的首元素是它的第一行,a就是第一行的地址
//a+1就是跳过第一行,表示第二行的地址
printf("%d\n", sizeof(*(a + 1)));//16
//*(a + 1)是对第二行地址的解引用,拿到的是第二行
//*(a+1)-->a[1]
//sizeof(*(a+1))-->sizeof(a[1])
//
printf("%d\n", sizeof(&a[0] + 1));//4/8
//&a[0] - 对第一行的数组名取地址,拿出的是第一行的地址
//&a[0]+1 - 得到的是第二行的地址
//
printf("%d\n", sizeof(*(&a[0] + 1)));//16
printf("%d\n", sizeof(*a));//16
//a表示首元素的地址,就是第一行的地址
//*a就是对第一行地址的解引用,拿到的就是第一行
//
printf("%d\n", sizeof(a[3]));//16
printf("%d\n", sizeof(a[0]));//16
//int a = 10;
//sizeof(int);
//sizeof(a);
return 0;
}
2.strlen
本质是一个函数,有传参,有返回值
从给定的地址开始往后数字符,直到遇到\0停下,
所以strlen(int x)不对
char*p = "abcdefg";
strlen(&p)和strlen(&p+1):
strlen是一个函数,接收一个char*参数,从此参数开始往后一个字节一个字节遍历直到遇到\0停止,返回一个整数
&p会从p开始往后遍历,p里面存的是一个4/8个字节的地址,谁也不知地址里面有没有表示\0的ASCII码值,所以谁也不知会不会在读取p的每一个字节时停下来
3.指针题
这张图知识点:强制类型转换以及转换后的运算规则,内存存储方式(小端存储),%x
在C语言中,%x
是一个格式说明符,用于将整数以十六进制形式输出
4.二维数组的初始化错误