一文搞定C语言指针与地址

本文详细解析指针概念,包括指针与地址的关系,const修饰字符串的特性和应用。通过实例演示,讲解了修改const指针指向内容的限制,并更新了关键知识点。重点讨论了char数组与const指针的操作,适合进阶学习者阅读。
摘要由CSDN通过智能技术生成


一、指针与地址

题目

int a=6 ;
int *p=&a;
int **p1=&p;
int &p2=p;
请问一下结果中值为6的是?
A:&p
B:**p1
C:*p2
D:*p1

分析

如何理解 int a =6
在这里插入图片描述
这句代码的意思是在内存中开辟0x3848921这块地址大小为int的空间来存放一个int型数据6。并给这段空间取别名为a
因此,a表示为这段空间的内容 6, &a表示该段空间的起始地址0x3848921

如何理解int *p =&a?
int *p=&a;其实表示的意思是int *p; p=&a,含义就是p指向a
在这里插入图片描述
其含义表示为在内存中开辟了0x3256567开始的大小为8byte的空间来存放a的地址

如何理解int **p1=&p
其表示的是int **p1; p1=&p
也就是说p1中存放的是p的地址
在这里插入图片描述
如何理解 int &p2==p?
这个表述是错误的,因为在内存中我们并没有申明一块空间为p2呀,那么如何进行&p2(取p2的地址)呢?

分析A选项:
p中存放的是a的地址,而&p表示的是取p这块空间的地址,所以答案肯定不是6,而是0x325657

分析B选项:
p1中存放的是p的地址,那么*p1表示的是p1中存放的地址(p的地址)的空间中存放的内容即a的地址。那么 **p1表示的就是p中存放的地址(a的地址)的内容即6。因此B正确

分析C选项:
p2,根本没有声明p2,怎么p2呢?

分析D选项:
p1,表示的是p1所指向的地址内容,p1中存放的地址是p的地址,那么p的内容就是a的地址,那么p1就是a的地址 0x3848921

答案

因此答案是B **p1

二、const修饰字符串

例题

char* const strA="hello world";
const char* strB="hello world";
下面操作正确的是

A:strA[0]='H';
B:strB[0]='H';
C:strA="123";
D:strB="123";

分析

char * const strA="hello world"
表示的是strA所指向的空间是"hello world"字符常量,且strA所指的地址无法改变
const char* strB="hello world"
表示的是strB所指向的空间是"hello world"字符常量,且strB所指的地址是可以改变的但是其内容可以改变

答案

选择D

三、 升级一下第二题

char str[]="hello world";
char* const strA=str;
const char* strB=str;
下面操作正确的是

A:strA[0]='H';
B:strB[0]='H';
C:strA="123";
D:strB="123";

正确答案

AD

总结

关于最后一题,大佬可以自行跳过,有经过该文章明白其知识点的朋友欢迎大家评论区分析

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jacky~~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值