当前位置:网站首页>深入刨析的指针(题解)
深入刨析的指针(题解)
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,所以字节4strlen题型
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,所以字节4strlen题型
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. 除此之外所有的数组名都表示首元素的地址。
大家喜欢的话,来个三连支持一下博主吧!

边栏推荐
- Redis SDS principle
- Is there a completely independent localization database technology
- 电机控制反Park变换和反Clarke变换公式推导
- Derivation of anti Park transform and anti Clarke transform formulas for motor control
- Audio-AudioRecord Binder通信机制
- [pointer training - eight questions]
- 不赚钱的科大讯飞,投资价值该怎么看?
- Leetcode problem solving -- 173 Binary search tree iterator
- Microservice registration and discovery
- Handwriting database client
猜你喜欢

C # create self host webservice

IPv6 jobs

Recommended foreign websites for programmers to learn

Princeton University, Peking University & UIUC | offline reinforcement learning with realizability and single strategy concentration

2022工作中遇到的问题四

MySQL Server层四个日志

StrError & PERROR use yyds dry inventory

Crazy, thousands of netizens are exploding the company's salary

ASU & OSU | model based regularized off-line meta reinforcement learning
How to do function test well
随机推荐
Add one to non negative integers in the array
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
Sign SSL certificate as Ca
4. File modification
Overview of OCR character recognition methods
Huawei, H3C, Cisco command comparison, mind map form from the basic, switching, routing three directions [transferred from wechat official account network technology alliance station]
Technology sharing | what if Undo is too big
如何做好功能测试
Era5 reanalysis data download strategy
Detailed use of dbutils # yyds dry goods inventory #
Analyze 菜单分析
Audio-AudioRecord Binder通信机制
Résumé des méthodes de reconnaissance des caractères ocr
My C language learning record (blue bridge) -- on the pointer
SD卡报错“error -110 whilst initialising SD card
Selenium share
1003 emergency (25 points), "DIJ deformation"
[Li Kou] the second set of the 280 Li Kou weekly match
The next industry outlet: NFT digital collection, is it an opportunity or a foam?