欢迎关注小鱼的博客:我的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的区别应该清楚了吧。
=========================== 未完 待更新=======================