目录
6.笔试题6
7.笔试题7
8.笔试题8
9.笔试题9
10.笔试题10
6.笔试题6
笔试题6char* p = "abcdef";printf("%zd\n", sizeof(p));//p是首元素a的地址,是地址就打印4/8printf("%zd\n", sizeof(p+1));//p是首元素地址,+1跳过1个sizeof(char)字节,也就是跳到b的地址,是地址就打印4/8printf("%zd\n", sizeof(*p));//首元素地址接引用,是'a',打印1printf("%zd\n", sizeof(p[0]));//相当于加0后解引用,所以是'a',打印1printf("%zd\n", sizeof(&p));//二级指针,是地址就打印4/8printf("%zd\n", sizeof(&p+1));//是地址就4/8printf("%zd\n", sizeof(&p[0]+1));//p[0]是首元素地址+0再解引用,得到'a',再将'a'的地址取出来,最后得到的是地址,是地址就打印4/8
7.笔试题7
//笔试题7
char* p = "abcdef";
printf("%zd\n", strlen(p));
//p是首元素地址,从'a'开始数,打印6
printf("%zd\n", strlen(p + 1));
//首元素地址+1,跳到b的地址,从b的地址开始数,打印5
printf("%zd\n", strlen(*p));
//strlen接受的不是字符型地址,报错
printf("%zd\n", strlen(p[0]));
//strlen接受的不是字符型地址,报错
printf("%zd\n", strlen(&p));
//传递的是二级指针,无关,打印随机值
printf("%zd\n", strlen(&p + 1));
//p是首元素地址,取出地址的地址是二级指针,随机值
printf("%zd\n", strlen(&p[0] + 1));
//p[0]是加0后解引用,就是'a',取出'a'的地址再加1,就是b的地址,打印5
8.笔试题8
int a[3][4] = { 0 };printf("%zd\n", sizeof(a));//sizeof(数组名)表示整个数组,整个数组48个字节,打印48printf("%zd\n", sizeof(a[0][0]));//a[0][0]拿到二维数组第一个元素,4个字节,打印4printf("%zd\n", sizeof(a[0]));//a[0]是第一行的数组名,sizeof(数组名)表示整个数组,第一行16个字节,打印16printf("%zd\n", sizeof(a[0]+1));//a[0]是第一行的数组名,既不是sizeof(数组名),也不是&数组名,所以是第一行首元素地址//第一行首元素地址+1,还是地址,是地址就打印4/8printf("%zd\n", sizeof(a+1));//a是首元素地址,+1是第二行地址,是地址就打印4/8printf("%zd\n", sizeof(*(a+1)));//a是首元素地址也就是第一行地址,第一行地址+1后是第二行地址,第二行地址解引用得到的是第二行,第二行一共16个字节//打印16printf("%zd\n", sizeof(&a[0]+1));//a[0]是第一行的数组名,&数组名,拿出整个第一行的地址,+1后表示第二行的地址,//是地址就打印4/8printf("%zd\n", sizeof(*(&a[0] + 1)));//这里的a[0]是第一行数组名,&数组名+1,拿到第二行的地址,*表示拿到第二行,第二行一共16个字节printf("%zd\n", sizeof(*a));//a表示首元素地址,也就是第一行的地址,解引用得到第一行,第一行16个字节,打印16printf("%zd\n", sizeof(a[3]));//a[3]是第四行,不会过载,不会计算,打印16
9.笔试题9
#include<stdio.h>
int main()
{//笔试题9int a[5] = { 1,2,3,4,5 };int* ptr = (int*)(&a + 1);//取出整个数组的地址,+1,跳过这个数组//a[][][][] [][][][] [][][][] [][][][]&a+1printf("%d,%d", *(a + 1), *(ptr - 1));//第一个是数组首元素地址+1,跳过1个int字节,指向2的地址,解引用后为2//第二个 ptr是个指针,指针-1,跳过1个sizeof(int),也就是减去四个字节//[][][][] [][][][] [][][][] [][][][] ptr-4[][][][] ptr//第二个地址指向的是arr[4],打印5return 0;
}
10.笔试题10
//笔试题10int a[3][2] = { (0,1),(2,3),(4,5) };//逗号表达式,{1,3,5}int* p;p = a[0];//a[0]是第一行数组名,数组名表示首元素地址,所以它表示的是第一行首元素的地址printf("%d", p[0]);//第一行首元素,也就也是打印1return 0;
注意:这里的二维数组初始化用的是( ),那么就会变成逗号表达式
逗号表达式: 表达式1,表达式2 ,表达式3
逗号表达式的先进行表达式1,再进行表达式2,最后进行表达式3,但是它的结果只看表达式3
所以这里的二维数组初始化其实是1,3,5,a[0][1] 为5