笔试题之指针和数组的精讲

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

⸝⋆ ━━━┓

  • 个性标签 - :来于"云"的"羽球人"。 Talk is cheap. Show me the code

┗━━━━━━━ ➴ ⷯ

本人座右铭 : 欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑

💎💎💎自💎💎💎

💎💎💎信💎💎💎

👑💎💎 💎💎👑 希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑 此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回

👑👑👑💎👑👑👑

一:一维数组

二:字符数组

三:二维数组


对sizeof() strlen()函数理解

sizeof():统计参数大小,单位是字节

strlen(): 是统计字符串长度的函数,只统计**\0** 之前的字符个数,对应参数 类型必须是char*

1.一维数组习题

//一维数组

int a = {1,2,3,4};

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(a1));

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

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

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

printf("%d\n",sizeof(&a0));

printf("%d\n",sizeof(&a0+1));
我们在做题之前需要先知道以下知识点:

1)数组名表示数组首元素的地址

2)但有2个例外:sizeof(数组名),这里的数组名表示整个数组,这个求的是整个数组的大小,单位是字节

3) &数组名:这里的数组表示整个数组,取出的是整个数组的地址

解析如下:

int a\[\] = { 1,2,3,4 };

printf("%d\n", sizeof(a));// 16 int类型数据占4个字节,所以此数组元素总的字节数是 4*4 = 16

printf("%d\n", sizeof(a + 0));// 4(x86环境) / 8(64环境) a+0表示首元素的地址,是地址就是4/8个字节

printf("%d\n", sizeof(*a));//4 sizeof(4) 4的数据类型是int类型

printf("%d\n", sizeof(a + 1));//4 a+1表示第二个元素地址,是地址就是4/8个字节

printf("%d\n", sizeof(a1));//4 求实等价于求sizeof(2)所占的字节数

printf("%d\n", sizeof(&a));// 4/8 &a取出的是整个数组地址,sizeof(&a)求的是整个数组地址,是地址就是4/8个字节

printf("%d\n", sizeof(*&a));// 16 &a取出的是整个数组的地址,之后在进行解引用,访问就是整给数组,所以此数组所占的字节数:4*4

printf("%d\n", sizeof(&a + 1));// 4/8 &a+1 跳过整个数组的地址,但是求的仍是数组的地址

printf("%d\n", sizeof(&a0));// 4 / 8 求的是数组首元素的地址

printf("%d\n", sizeof(&a0 + 1));// 4 / 8 求的是第二个元素地址

printf("%d\n", sizeof(&a + 1));// 4/8 &a+1 跳过整个数组的地址,但是求的仍是数组的地址

2.字符数组

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(arr1));

printf("%d\n", sizeof(&arr));

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

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

printf("%d\n", strlen(arr));

printf("%d\n", strlen(arr+0));

printf("%d\n", strlen(*arr));

printf("%d\n", strlen(arr1));

printf("%d\n", strlen(&arr));

printf("%d\n", strlen(&arr+1));

printf("%d\n", strlen(&arr0+1));

首先我们对**strlen()和sizeof()**要先有基本的了解

解析如下:

printf("%d\n", strlen(*arr));

printf("%d\n", strlen(arr1));

以上2个代码是错误的,因为strlen()参数类型是char* 的指针

但实际传的并不是指针,而是一个字符,所以会报错

2.用字符串初始化字符数组

对应运行结果:

3.字符串初始化字符指针

char *p = "abcdef";

printf("%d\n", sizeof(p));

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

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

printf("%d\n", sizeof(p0));

printf("%d\n", sizeof(&p));

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

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

printf("%d\n", strlen(p));

printf("%d\n", strlen(p+1));

printf("%d\n", strlen(*p));

printf("%d\n", strlen(p0));

printf("%d\n", strlen(&p));

printf("%d\n", strlen(&p+1));

printf("%d\n", strlen(&p0+1));

4.二维数组

int a34 = {0};

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

printf("%d\n",sizeof(a00));

printf("%d\n",sizeof(a0));

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

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

总结: 数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

  3. 除此之外所有的数组名都表示首元素的地址。

对应解析如下:

4.1对二维数组的理解

我们可以把二维数组看成是一维数组的数组

4.2对a0, a1 ,a2 理解

注意这里 a0 可不同于一维数组的a0,这里的a0 表示:第一行元素所对应的数组名,同时也表示首元素的di'zh

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

a0代表第一行元素的地址,对应类型是int*,指针+1跳过4个字节,此时a0+1指向第一行的第二列元素的地址,此时所求地址大小是 4 / 8字节

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

a0+1此时指向的是这个二维数组第一行第二列元素地址

*(a0+1)是对第一行第二列元素地址进行解引用,及取出的的元素 0,对应大小是4个字节

相关推荐
程序员-Benothing20 分钟前
Java ForkJoinPool 详解:从分治思想到高性能并行计算
java·开发语言·后端·面试·职场和发展
脚踏实地皮皮晨35 分钟前
003006001_WrapPanel控件
开发语言·c#·.net·wpf·visual studio
上海安当技术1 小时前
单点登录 SSO 怎么选协议?SAML 2.0 / OAuth 2.0 / OIDC / CAS 对比与 ERP、OA、CRM 接入实战
java·开发语言
不才不才不不才1 小时前
Spring 源码系列(14): JDK 动态代理 vs CGLIB,以及拦截器责任链
java·开发语言·spring
mifengxing1 小时前
计算机组成原理——存储器系统
开发语言·考研·计算机组成原理·复习笔记·计算机408
only-lucky2 小时前
QML深入学习五(Controls模块)
前端·javascript·学习
Yolanda_20222 小时前
Python学习-第九部分-错误处理与异常处理
开发语言·python·学习
郝学胜-神的一滴2 小时前
Qt 高级编程 037:QSS按钮样式封神指南
开发语言·c++·qt·软件工程·用户界面
DFT计算杂谈2 小时前
SCIENTIFIC REPORTS 非 van der Waals可调二维磁性材料设计平台
开发语言·php
库拉库拉里2 小时前
深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别及实践指南
开发语言·c#