指针和数组笔试题

发布于:2022-12-22 ⋅ 阅读:(407) ⋅ 点赞:(0)

*注:这里我们都用64位的电脑运行,指针的大小为8个字节

1.一维数组

int a [] = { 1 , 2 , 3 , 4,5 };
printf ( "%d\n" , sizeof ( a ));
printf ( "%d\n" , sizeof ( a + 0 ));
printf ( "%d\n" , sizeof ( * a ));
printf ( "%d\n" , sizeof ( a + 1 ));
printf ( "%d\n" , sizeof ( a [ 1 ]));
printf ( "%d\n" , sizeof ( & a ));
printf ( "%d\n" , sizeof ( *& a ));
printf ( "%d\n" , sizeof ( & a + 1 ));
printf ( "%d\n" , sizeof ( & a [ 0 ]));
printf ( "%d\n" , sizeof ( & a [ 0 ] + 1 ));

请写出你的答案!这里我们在64位的电脑上运行,指针的大小为8个字节

解析如下:

 这里我们要明白:

                    sizeof(数组名),这里数组名代表的是整个数组,并不是数组首元素或首元素地址。

                    &数组名,代表的是取数组的地址,加1,后跳过的是整个数组,即跳过int  (*)[5]大小

2.字符数组 

2.1sizeof()

// 字符数组
char arr [] = { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' };
printf ( "%d\n" , sizeof ( arr ));
printf ( "%d\n" , sizeof ( arr + 0 ));
printf ( "%d\n" , sizeof ( * arr ));
printf ( "%d\n" , sizeof ( arr [ 1 ]));
printf ( "%d\n" , sizeof ( & arr ));
printf ( "%d\n" , sizeof ( & arr + 1 ));
printf ( "%d\n" , sizeof ( & arr [ 0 ] + 1 ));
请写出你的答案!

 解析:

 这里我们要强调,如果 char arr[]="abcdef",这里系统会为其自动添加结束标志‘\0’,所以大小会大1.

char * p = "abcdef" ;
printf ( "%d\n" , sizeof ( p ));
printf ( "%d\n" , sizeof ( p + 1 ));
printf ( "%d\n" , sizeof ( * p ));
printf ( "%d\n" , sizeof ( p [ 0 ]));
printf ( "%d\n" , sizeof ( & p ));
printf ( "%d\n" , sizeof ( & p + 1 ));
printf ( "%d\n" , sizeof ( & p [ 0 ] + 1 ));
请写出你的答案!

解析:

2.2strlen

// 字符数组
char arr [] = { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' };
printf ( "%d\n" , strlen ( arr ));
printf ( "%d\n" , strlen ( arr + 0 ));
printf ( "%d\n" , strlen ( * arr ));
printf ( "%d\n" , strlen ( arr [ 1 ]));
printf ( "%d\n" , strlen ( & arr ));
printf ( "%d\n" , strlen ( & arr + 1 ));
printf ( "%d\n" , strlen ( & arr [ 0 ] + 1 ));
请写出你的答案!

 解析:

 char arr[] = "abcdef";

printf ( "%d\n" , strlen ( arr ));
printf ( "%d\n" , strlen ( arr + 0 ));
printf ( "%d\n" , strlen ( * arr ));
printf ( "%d\n" , strlen ( arr [ 1 ]));
printf ( "%d\n" , strlen ( & arr ));
printf ( "%d\n" , strlen ( & arr + 1 ));
printf ( "%d\n" , strlen ( & arr [ 0 ] + 1 ));
请写出你的答案!

 解析:

3.代码

指针和数组相关试题 · d5b0fc1 · 风夏/C语言进阶 - Gitee.com

#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

//int main()
//{
//	//一维数组
//	int a[] = { 1,2,3,4,5 };
//    printf("%d\n", sizeof(a));
//    //sizeof里面的a代表的是整个数组,求的是整个数组的大小,及4*5=20
//    printf("%d\n", sizeof(a + 0));
//    //这里a代表的是数组首元素的地址,加0,说明是下标为0的元素的地址,地址大小为8个字节
//    printf("%d\n", sizeof(*a));
//    //这里对a进行解引用,a为int型变量,大小为4个字节
//    printf("%d\n", sizeof(a + 1));
//    //这里a为首元素地址,加1,说明是下标为1的元素的地址,地址大小为8个字节
//    printf("%d\n", sizeof(a[1]));
//    //这里a[1]代表第二个元素,大小即为4个字节
//    printf("%d\n", sizeof(&a));
//    //我们看到取地址的符号,地址大小为8个字节
//    printf("%d\n", sizeof(*&a));
//    //&a是数组的地址,是数组指针类型,*&a是都数组指针解引用,访问一个数组的大小
//    printf("%d\n", sizeof(&a + 1));
//    //地址的大小为8个字节
//    printf("%d\n", sizeof(&a[0]));
//    //地址大小为8个字节
//    printf("%d\n", sizeof(&a[0] + 1));
//    //地址大小为8个字节
//	return 0;
//}

//int main()
//{
//    //字符数组
//    char arr[] = { 'a','b','c','d','e','f' };
//    printf("%d\n", sizeof(arr));
//    //sizeof里面的数组名arr代表的是整个数组,大小为1*6=6
//    printf("%d\n", sizeof(arr + 0));
//    //arr代表数组首元素的地址,加0,表示&arr[0],大小为8
//    printf("%d\n", sizeof(*arr));
//    //arr代表首元素地址,对其解引用,表示元素'a',大小为1
//    printf("%d\n", sizeof(arr[1]));
//    //这个与上一个相同,都是表示元素,这个代表的是第二个元素,大小为1
//    printf("%d\n", sizeof(&arr));
//    //地址的大小为8
//    printf("%d\n", sizeof(&arr + 1));
//    //&arr代表取得是这个数组的地址,加1,跳过整个数组,指向‘f’后面的地址,大小为8
//    printf("%d\n", sizeof(&arr[0] + 1));
//    //表示第二个元素的地址大小为8
//}

//int main()
//{
//	//字符数组
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%d\n", strlen(arr));
//	//strlen统计字符串长度时遇到‘\0’,才停止,但我们字符串结束标志,所以长度为随机值
//	printf("%d\n", strlen(arr + 0));
//	//从第一个元素开始,字符串长度,字符串没有结束标志,和上一个结果相同
//	//printf("%d\n", strlen(*arr));
//	// strlen我们应当传递数组名,这里传递的是元素‘a’,ASCⅡ为97,传递过去,无法判断
//	//printf("%d\n", strlen(arr[1]));
//	//这里我们仍然传递的是元素,无法判断
//	printf("%d\n", strlen(&arr));
//	//&arr代表整个数组地址,还是从第一个元素进行统计,和第一个结果相同
//	printf("%d\n", strlen(&arr + 1));
//	//&arr代表取整个字符串地址,加1,跳过整个字符串,即'f'后面的地址,从之个地址开始统计,结果为随机值
//	printf("%d\n", strlen(&arr[0] + 1));
//	//从第二个元素的地址开始统计字符串长度随机值,第一个结果-1
//}

//int main()
//{
//	char arr[] = "abcdef";
//	printf("%d\n", strlen(arr));
//	//正常计算字符串长度,括号内arr是数组首元素地址,遇到'\0',结束统计,结果为6;
//	printf("%d\n", strlen(arr + 0));
//	//传过去的是首元素的地址,统计字符串长度,结果为6
//	//printf("%d\n", strlen(*arr));
//	// 传过去的首元素,对‘a’进行统计,错误
//	//printf("%d\n", strlen(arr[1]));
//	//传过去的是第二个元素,对‘b’进行计算字符串长度,转化为ASCⅡ,为98,但是需要的是地址,错误。
//	printf("%d\n", strlen(&arr));
//	//整个数组的地址传过去进行统计,进行类型转化,从char (*)[6]转化为char*类型,结果为6;
//	printf("%d\n", strlen(&arr + 1));
//	//&arr取得是整个数组的地址,加1后,到了‘\0’后面,再进行统计,结果不确定
//	printf("%d\n", strlen(&arr[0] + 1));
//	//从第二个元素开始统计,结果为5
//}

int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));
	//p的实际意义是字符串“abcde,大小为8
	printf("%d\n", sizeof(p + 1));
	//首元素地址加1,第二个元素的地址的大小为8;	
	printf("%d\n", sizeof(*p));
	//对p进行解引用,*p=a,char类型大小为一个字节
	printf("%d\n", sizeof(p[0]));
	//第一个元素,大小为1
	printf("%d\n", sizeof(&p));
	//&p是指针的地址,大小为8
	printf("%d\n", sizeof(&p + 1));
	//&p指针的地址加1,跳过8个字节,下个地址的大小为8
	printf("%d\n", sizeof(&p[0] + 1));
	//先对其解引用,再去地址,加一后,指向下个元素的地址,大小为8
}

4.二维数组

// 二维数组
int a [ 3 ][ 4 ] = { 0 };
printf ( "%d\n" , sizeof ( a ));
printf ( "%d\n" , sizeof ( a [ 0 ][ 0 ]));
printf ( "%d\n" , sizeof ( a [ 0 ]));
printf ( "%d\n" , sizeof ( a [ 0 ] + 1 ));
printf ( "%d\n" , sizeof ( * ( a [ 0 ] + 1 )));
printf ( "%d\n" , sizeof ( a + 1 ));
printf ( "%d\n" , sizeof ( * ( a + 1 )));
printf ( "%d\n" , sizeof ( & a [ 0 ] + 1 ));
printf ( "%d\n" , sizeof ( * ( & a [ 0 ] + 1 )));
printf ( "%d\n" , sizeof ( * a ));
printf ( "%d\n" , sizeof ( a [ 3 ]));
请写出你的答案!

解析如下 :

 

 4.1代码

数组指针相关练习(二维数组)/源.c · 风夏/C语言进阶 - 码云 - 开源中国 (gitee.com)

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	//二维数组
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));
	//a单独放在sizeof里面,代表整个二维数组,大小为12*4=48;
	printf("%d\n", sizeof(a[0][0]));
	//a[0][0]等价于*(*(a+0)+0),代表第一个元素,大小为4;
	printf("%d\n", sizeof(a[0]));
	//这里我们需要明白二维数组中的a[0],是第一行的数组名,a[0]是一个一维数组,大小为4*4=16;
	printf("%d\n", sizeof(a[0] + 1));
	//这里a[0]是一位数组首元素地址,加1后,代表第二个元素地址,a[0]+1等价于*(a+0)+1,再次解引用才是元素
	//大小位8;
	printf("%d\n", sizeof(*(a[0] + 1)));
	//*(a[0]+1)等价于a[0][1],也等价于*(*(a+0)+1),代表第二个元素,大小为4;
	printf("%d\n", sizeof(a + 1));
	//这里a为一维数组a[0]的首元素地址,加1后,代表第二个元素地址,大小为8;
	printf("%d\n", sizeof(*(a + 1)));
	//*(a+1)等价于a[1],是第二行数组名,大小为4*4=16;
	printf("%d\n", sizeof(&a[0] + 1));
	//&a[0]是取整个第一行的地址,加一后是整个第二行的地址,地址的大小为8;
	printf("%d\n", sizeof(*(&a[0] + 1)));
	//第二行的地址解引用后,代表整个第二行数组,大小为4*4=16;
	printf("%d\n", sizeof(*a));
	//a代表首元素地址,首元素地址是a[0]的地址,解引用,代表整个第一行这个一维数组,大小为4*4=16;
	printf("%d\n", sizeof(a[3]));
	//a[3]是第三行数组名,大小为4*4=16;
}


网站公告

今日签到

点亮在社区的每一天
去签到