当前位置:网站首页>深入刨析的指针(题解)
深入刨析的指针(题解)
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. 除此之外所有的数组名都表示首元素的地址。
大家喜欢的话,来个三连支持一下博主吧!
边栏推荐
- 【指针训练——八道题】
- 【若依(ruoyi)】设置主题样式
- BUUCTF刷题笔记——[极客大挑战 2019]EasySQL 1
- Zhang Lijun: penetrating uncertainty depends on four "invariants"
- Deep parsing pointer and array written test questions
- SD卡报错“error -110 whilst initialising SD card
- How to do function test well
- ERA5再分析资料下载攻略
- [pointer training - eight questions]
- tcpdump: no suitable device found
猜你喜欢
Reverse repackaging of wechat applet
NR modulation 1
How to do function test well
Redo file corruption repair
I sorted out a classic interview question for my job hopping friends
Problems encountered in 2022 work IV
Computer graduation project asp Net fitness management system VS development SQLSERVER database web structure c programming computer web page source code project
华为、H3C、思科命令对比,思维导图形式从基础、交换、路由三大方向介绍【转自微信公众号网络技术联盟站】
[unity3d] GUI control
MySQL advanced notes
随机推荐
[pointer training - eight questions]
Princeton University, Peking University & UIUC | offline reinforcement learning with realizability and single strategy concentration
#PAT#day10
mysqldump数据备份
SD卡报错“error -110 whilst initialising SD card
Redis cache breakdown, cache penetration, cache avalanche
Prototype design
How to do function test well
继承day01
Software design principles
The difference between sizeof and strlen in C language
[concept] Web basic concept cognition
Who is the winner of PTA
Handwriting database client
CSP numeric sort
Crazy, thousands of netizens are exploding the company's salary
Derivation of anti Park transform and anti Clarke transform formulas for motor control
不赚钱的科大讯飞,投资价值该怎么看?
Descriptor implements ORM model
Leetcode problem solving -- 98 Validate binary search tree