当前位置:网站首页>深入刨析的指针(题解)
深入刨析的指针(题解)
2022-07-06 03:11:00 【小蜗牛向冲】
前言
作者:小蜗牛向前冲
名言:我可以接收失败,但我不能接收放弃
如果觉的博主的文章还不错的话,还请点赞,收藏,关注支持博主。如果发现有问题的地方欢迎*大家在评论区指正。
目录
对于C语言指针是非常重要的,为了更加透彻的理解指针,下面将为大家分享一些指针的题目,在对题目的解析中玩转指针。
在做题之前,我们需要的理解数组名是什么。
数组名
在通常情况下指首元素的地址
在二种特殊情况下,指的是整个数组的地址
1 &地址数组名
2 sizeof(数组名)(单独出现)
一维数组
//一维数组
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//a指的是整个数组名,所以字节大小为4*4=16
printf("%d\n", sizeof(a + 0));//a指的是首元素的地址,a+0表示跳过字节数4*0=0,指向1,所以字节大小为4
printf("%d\n", sizeof(*a));//a指的是首元素的地址,对*a找到1,1的字节大小为4
printf("%d\n", sizeof(a + 1));//a指的是首元素的地址,a+1表示跳过字节数4*1=4,指向2,所以字节数为4
printf("%d\n", sizeof(a[1]));//a[1]-->*(a+1),找到2,所以字节数为4
printf("%d\n", sizeof(&a));//&a表示取出整个数组的地址,地址在32位平台的大小都为4个字节
printf("%d\n", sizeof(*&a));//&a表示取出整个数组的地址,*&a找到数组每个元素,字节大小4*4=16
printf("%d\n", sizeof(&a + 1));//&a+1,仍然表示的是地址的大小为4个字节
printf("%d\n", sizeof(&a[0]));//&a[0]-->&*(a+0),表示&1,取出1的地址,地址的大小仍然为4个字节
printf("%d\n", sizeof(&a[0] + 1));//&a[0]+1表示&2,字节大小为4
对于一维数组中,我们始终要记住,数组在的意义是什么。
在32位平台下地址的大小始终为4个字节大小
字符数组
字符数组有二种初始情形,下面我们将题目中细细体会。
情形1
sizeof题型
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//整个数组的大小,数组的每个元素斗为char类型,大小为1个字节,所以1*6=6
printf("%d\n", sizeof(arr + 0));//arr+0指首元素的地址,所以4个字节
printf("%d\n", sizeof(*arr));//*arr找到'a',所以1个字节
printf("%d\n", sizeof(arr[1]));//arr[1]-->*(arr+1),找到'b',所以1个字节
printf("%d\n", sizeof(&arr));//&arr表示取出整个数组的地址,所以字节大小为4个字节
printf("%d\n", sizeof(&arr + 1));//&arr+1表示取出数组后面的地址,所以4个字节
printf("%d\n", sizeof(&arr[0] + 1));//同理,所以4个字节
strlen题型
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));//'\0'位置未定,随机值
printf("%d\n", strlen(arr + 0));//随机值
printf("%d\n", strlen(*arr));//传参有问题,无法求值-->strlen(a)-->strlen(97)(野指针)
printf("%d\n", strlen(arr[1]));//arr[1]-->*(arr+1),传参有问题,无法求值-->strlen(b)-->strlen(98)
printf("%d\n", strlen(&arr));//&arr整个数组的地址,随机值
printf("%d\n", strlen(&arr + 1));//随机值-1*6
printf("%d\n", strlen(&arr[0] + 1));//&*arr[0]+1--&*(arr+0)+1,随机值-1
归纳
sizeof是一个操作符求的是字节大小,strlen是函数求的是字符串的大小。
char arr[] = { 'a','b','c','d','e','f' };//这种初始化的方式在字符串的末尾并不会加上'\0'。
arr[0]可以等价于*(arr+0)
情形2
sizeof题型
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//求整个数组的大小,所以字节7
printf("%d\n", sizeof(arr + 0));//求首元素地址的大小,所以字节4
printf("%d\n", sizeof(*arr));//求首元素的大小,所以字节1
printf("%d\n", sizeof(arr[1]));//arr[1]-->*(arr+1),求b的大小,所以字节1
printf("%d\n", sizeof(&arr));//求整个数组地址的大小,所以字节4
printf("%d\n", sizeof(&arr + 1));//跳过整个数组地址的大小,所以字节4
printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]+1-->&*(arr+0)+1,所以字节4
strlen题型
char arr[] = "abcdef";
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));//跳过数组,后遇到'\0'的位置不定,所以是随机值
printf("%d\n", strlen(&arr[0] + 1));//传b的地址,所以5个字符
归纳
char arr[] = "abcdef";//字符末尾存在'\0'
常量字符串
sizeof题型
char* p = "abcdef";
//printf("%d\n", sizeof(p));//a的地址,所以字节4
//printf("%d\n", sizeof(p + 1));//b的地址,所以字节4
//printf("%d\n", sizeof(*p));//字符a,所以字节1
//printf("%d\n", sizeof(p[0]));//p[0]-->*(p+0),字符a,所以字节1
//printf("%d\n", sizeof(&p));//取出整个常量字符串的地址,所以字节4
//printf("%d\n", sizeof(&p + 1));//指向常量字符后面的地址,所以字节4
//printf("%d\n", sizeof(&p[0] + 1));//&*(p+0)+1-->&b,所以字节4
strlen题型
char* p = "abcdef";
printf("%d\n", strlen(p));//6给字符
printf("%d\n", strlen(p + 1));//传b的地址过去,字符5
printf("%d\n", strlen(*p));//传参有问题,无计算
printf("%d\n", strlen(p[0]));//传参有问题,无计算
printf("%d\n", strlen(&p));//把a地址的地址传过去,遇见'\0'的位置不定,随机值
printf("%d\n", strlen(&p + 1));//把b地址的地址传过去,遇见'\0'的位置不定,随机值
printf("%d\n", strlen(&p[0] + 1));//传b的地址,所以5个字符
归纳
常量字符串的变量名是常量字符串首地址。
&p对于strlen函数来说,传过去的是一个二级指针,首先首地址的地址中在内存中存储不知道是大端储存还是小端存储,这样使得遇到'\0'的位置无法判断,所以用strlen求出的是一个随机值。
二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//a表示计算整个数组的大小,48
printf("%d\n", sizeof(a[0][0]));//计算首元素的大小,4
printf("%d\n", sizeof(a[0]));//a[0]-->*(a+0),表示计数第一行的大小16
printf("%d\n", sizeof(a[0] + 1));//计算第二行第1个元素地址的大小4
printf("%d\n", sizeof(*(a[0] + 1)));//计数第二行第1个元素的大小4
printf("%d\n", sizeof(a + 1));//计算第二行第1个元素地址的大小4
printf("%d\n", sizeof(*(a + 1)));//计算第二行的大小16
printf("%d\n", sizeof(&a[0] + 1));//计算第二行的地址的大小4
printf("%d\n", sizeof(*(&a[0] + 1)));//计算第二行的大小16
printf("%d\n", sizeof(*a));//计算第一行的大小16
printf("%d\n", sizeof(a[3]));//虽然该数组已经越界,但我们求的是字节的大小是可以的,相当于求数组第N行的地址,16
归纳
二维数组的数组名指向数组的第1行
总结
数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。
大家喜欢的话,来个三连支持一下博主吧!
边栏推荐
- [kubernetes series] learn the exposed application of kubernetes service security
- [unity3d] GUI control
- IPv6 comprehensive experiment
- Custom attribute access__ getattribute__/ Settings__ setattr__/ Delete__ delattr__ method
- Web security SQL injection vulnerability (1)
- 【 kubernets series】 a Literature Study on the Safe exposure Applications of kubernets Service
- NR modulation 1
- Linear regression and logistic regression
- 适合程序员学习的国外网站推荐
- Safety science to | travel, you must read a guide
猜你喜欢
银行核心业务系统性能测试方法
【RISC-V】外部中断
MPLS experiment
Is there a completely independent localization database technology
【概念】Web 基础概念认知
My C language learning records (blue bridge) -- files and file input and output
Fault analysis | analysis of an example of MySQL running out of host memory
不赚钱的科大讯飞,投资价值该怎么看?
Résumé des méthodes de reconnaissance des caractères ocr
js 正则过滤和增加富文本中图片前缀
随机推荐
How to choose PLC and MCU?
Crazy, thousands of netizens are exploding the company's salary
NR modulation 1
XSS challenges bypass the protection strategy for XSS injection
Leetcode problem solving -- 99 Restore binary search tree
#PAT#day10
微服务间通信
【若依(ruoyi)】ztree 自定义图标(iconSkin 属性)
ASU & OSU | model based regularized off-line meta reinforcement learning
3857 Mercator coordinate system converted to 4326 (WGS84) longitude and latitude coordinates
Explore pointers and pointer types in depth
Some problem records of AGP gradle
【paddle】加载模型权重后预测报错AttributeError: ‘Model‘ object has no attribute ‘_place‘
Precautions for single chip microcomputer anti reverse connection circuit
MySQL learning notes-10-tablespace recycling
. Net 6 and Net core learning notes: Important issues of net core
[Chongqing Guangdong education] higher mathematics I reference materials of Southwest Petroleum University
IPv6 comprehensive experiment
Game theory matlab
IPv6 jobs