指针和数组笔试题理解

目录

一维数组

 字符数组

 二维数组


  1. 一维数组

关于sizeof的使用:

//sizeof计算的是整个数组的大小,单位是字节
//当sizeof直接跟数组名,即sizeof(数组名),数组名表示的是整个数组,计算的是整个数组的大小

// &数组名-数组名表示整个数组,可取出数组的地址
 //一般情况下数组名表示数组的首元素地址

接下来展示几个具体的例子

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

(每条注释后面为打印内容)

执行结果

 对于几个易混淆的表示以画图形式展示

sizeof(a+1)

//a+1跳过了一个整型

sizeof(a[0])----表示的是一个元素的大小

&a[0]+1表示是第二个元素的地址

&a+1 中&a是数组首元素的地址,加一则跳过整个数组

以上就是一维数组关于sizeof的使用,需要注意的是sizeof并非是一个函数

 字符数组

关于字符数组,这里主要是sizeof和strlen两者的区别

char arr[] = { 'a','b','c','d','e','f' };
    printf("%d\n", sizeof(arr));//6字节
    printf("%d\n", sizeof(arr + 0));//4/8
    printf("%d\n", sizeof(*arr));//1
    printf("%d\n", sizeof(arr[1]));//1
    printf("%d\n", sizeof(&arr));//4/8
    printf("%d\n", sizeof(&arr + 1));//4/8
    printf("%d\n", sizeof(&arr[0] + 1));//4/8

    printf("%d\n", strlen(arr));//随机值,因为找不到\0的位置
    printf("%d\n", strlen(arr + 0));//随机值
    //printf("%d\n", strlen(*arr));//非法访问
    //printf("%d\n", strlen(arr[1]));//‘b'-98被当成地址,但形参非法访问
    printf("%d\n", strlen(&arr));//随机值
    printf("%d\n", strlen(&arr + 1));//随机值-6
    printf("%d\n", strlen(&arr[0] + 1));//随机值-1

strlen参数必须为地址或者指针,否则会出现非法访问(上述代码中两者注释掉的即是)

先展示运行结果

 关于sizeof的结果这里不再一一解释,类似于上面的一维数组,读者自行学习。

重点来啦!!!

strlen是一个函数,用于计算长度,当遇到 \0即停止

 接下来是字符数组的另外一种表示~

char arr[] = "abcdef";//a b c d e f \0
    printf("%d\n", sizeof(arr));//7
    printf("%d\n", sizeof(arr + 0));//4/8
    printf("%d\n", sizeof(*arr));//1
    printf("%d\n", sizeof(arr[1]));//1
    printf("%d\n", sizeof(&arr));//4/8
    printf("%d\n", sizeof(&arr + 1));//4/8
    printf("%d\n", sizeof(&arr[0] + 1));//4/8

    printf("%d\n", strlen(arr));//6
    printf("%d\n", strlen(arr + 0));//6
    //printf("%d\n", strlen(*arr));//非法访问
    //printf("%d\n", strlen(arr[1]));//非法访问
    printf("%d\n", strlen(&arr));//6
    printf("%d\n", strlen(&arr + 1));//12
    printf("%d\n", strlen(&arr[0] + 1));//5
    

上述代码运行结果展示

 此处依旧不对sizeof做解释,大致说一下strlen. 与之前不一样的是这一次使用的“abcdef"为

a b c d e f \0 自动生成一个\0 故strlen在读取的时候就不会停不下来,不再是一个随机值。剩下的就不再做解释了,与之前一样。

 接下来是一个字符指针,其中sizeof不做展开,写其中几个典型的strlen就好了

int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//4/8
	printf("%d\n", sizeof(p + 1));//'b'的地址,4/8
	printf("%d\n", sizeof(*p));//1
	printf("%d\n", sizeof(p[0]));//1
	printf("%d\n", sizeof(&p));//4/8
	printf("%d\n", sizeof(&p + 1));//4/8
	printf("%d\n", sizeof(&p[0] + 1));//4/8

	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p + 1));//5,p+1是b的地址
	//printf("%d\n", strlen(*p));//非法访问
	//printf("%d\n", strlen(p[0]));//非法访问
	printf("%d\n", strlen(&p));//随机值
	printf("%d\n", strlen(&p + 1));//随机值
	printf("%d\n", strlen(&p[0] + 1));//5
}

 运行结果

printf("%d\n", strlen(&p));//随机值
    printf("%d\n", strlen(&p + 1));//随机值

这里出现随机值的原因:

 二维数组

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]));

 运行结果展示

 

printf("%d\n", sizeof(*(a[0] + 1)));

*(a[0]+1)为第一行第二列的元素,即4个字节

printf("%d\n", sizeof(a + 1));

a没有直接放在sizeof内部,故表示的是首元素的地址即第一行的地址 a[0],a+1即为第二行的地址

printf("%d\n", sizeof(*(a + 1)));

对第二行地址解引用则为第二行,4*4则为16

printf("%d\n", sizeof(&a[0] + 1));

&a[0]为第一行的地址,加1为第二行的地址---4/8

printf("%d\n", sizeof(*(&a[0] + 1)))

对第二行地址解引用则为第二行元素----4*4=16

printf("%d\n", sizeof(*a));

a表示的是数组首元素的地址

解引用第一行----16

printf("%d\n", sizeof(a[3]));

虽然没有a[3],但是由于sizeof不会进入内部,则仍为16

以上内容就到这里结束啦!

如有错误,可以指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haru不是白仁仔呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值