C语言指针专题——常见问题解答合集

欢迎关注小鱼的博客:我的CSDN技术博客


之前就C语言指针相关知识写过一个专题,包括我自己总结理解指针概念的方法,指针难学的原因,为何要学习指针,指针的灵活性等,都是在上班之余的空闲时光写下来的,平时由于工作较忙,这些专题文章写的也有好有坏。本篇文章我想就作为C语言指针专题的收尾吧,把初学者在学习指针时遇到的常见问题汇总下,一一给出解答。遇到的问题千千万万,所以本篇文章将会不定时更新,并且文章长度将会越来越长,朋友们可以收藏本文,方便随时查看有无更新。


最新的文章在“C语言编程技术分享”,也就是我的公众号里更新,欢迎关注!

=============================== 下面正文开始 ==============================

1.指针是什么?

本问题我用基本数据类型跟指针做对比。

这恐怕是初学者遇到的最多的一个问题了。其实这个问题很好回答,指针是一个变量,跟基本数据类型变量有很多的地方都是一样的。下面用一个程序来类比指针变量与整型变量朋友们就知道了。

#include <stdio.h>

int main(void)
{
    int a = 1;
    int *p = &a;

    printf("整型变量a的值是%d\n", a);
    printf("指针变量p的值是%x\n", p);
    printf("整型变量a的地址是%x\n", &a);
    printf("指针变量p的地址是%x\n", &p);

    return 0;
}

运行结果是:



这段代码很好理解,我们从以下几个角度来对比指针变量与整型变量:

1). 变量的初始化

指针变量p与整型变量a都需要首先被声明,然后赋予一个初值。代码中,整型变量a的初值是1,指针变量p的初值是变量a的地址。

2). 变量的类型

在定义指针变量p和整型变量a时,都需要指出它们的类型。

整型变量a的类型是int,指针变量p的类型也是int。

整型变量a的int是指变量a不是字符型,不是浮点型,而是一个整型;

指针变量p的int不是说变量p是一个整型变量,而是说p指向的值,本代码中是变量a,是一个整型。

在变量的类型概念方面,指针变量与基本数据变量有差异。

3). 变量的值

本代码中,整型变量a在定义时给予一个初值是1,1就是变量a的值;

指针变量p在定义时也被给予一个初值,这个初值是变量a的地址,变量a的地址就是变量p的值。从运行结果上一眼就能看出来。

4). 变量的地址

整型变量a有自己的地址,指针变量p也有自己的地址。

从本代码运行的结果来看,整型变量a的地址是0x12ff44,指针变量p的地址是0x12ff40。

从以上4个方面来对比,可以发现,指针变量跟基本类型变量,很多方面都是相同的,就把指针变量当成一半的基本类型变量来理解好了,所以别看教材上说的很高达上,很高深,其实探明了本质,也就那样。

2.指针变量存放的是一个数值的地址吗?

本问题用基本数据类型来说明。指针变量存放的是基本数据类型的地址,换句话说,指针变量的值,肯定是一个数,这个数是基本数据类型变量的地址。在第一问中通过运行结果可以很容易的看出来。

3.指针变量签名加*号和不加*号的区别?

本问题用基本数据类型来说明。

这是很多人经常会搞混的问题。按照一般的说法,指针变量前面不加*号,输出的是指针变量自己的数值,前面加*号,输出的是另外一个数值,这个数值的地址就是指针变量自己的值。很晕是不是?看下面的代码:

#include <stdio.h>

int main(void)
{
    int a = 1;
    int *p = &a;

    printf("指针变量p前面加*,也就是*p的值是%d\n", *p);
    printf("指针变量p前面不加*,也就是p的值是%d\n", p);

    return 0;

}

运行的结果是:


从结果中可以看出以下2点:

1). 指针变量p前面不加*号,p输出的值是1244996,这个是变量p自己的值,也是整型变量a的地址;

2). 指针变量p前面加*号,*p输出的是1,也就是变量a的值;

*p和p的区别应该清楚了吧。

=========================== 未完 待更新=======================



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C语言答疑课堂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值