C语言指针可谓是C语言的灵魂,无论是在C语言算法,还是在数据结构,他无处不在。指针,这对于老手如同家常便饭一样的操作,却在萌新面前如同一座万丈高山!
中国的伟人曾经说过:
世上无难事,只怕有心人!
C语言指针理解得透彻不透彻,全看你有没有下功夫,不过更多是要看有没有一个合适的引子,来启蒙你对他的认知。
指针变量类型有哪些?
众所周知,C语言中的基本变量类型有:整型变量,浮点型变量与字符型变量。
基本变量类型
指针变量类型
整型(int)
整型(int *)
浮点型(float)
浮点型(float *)
双精度(double)
双精度(double *)
字符型(char)
字符型(char *)
以上列举了最常用的几种指针变量类型,分别对应其所能存储的内存地址中值的类型。
例如:int *型指针变量只能存储值为int类型的变量的内存地址。 C语言指针讲究得就是门当户对,各位同学可别乱当月老牵红线……
C语言如何声明指针变量?
在C语言中,指针的一般声明格式如下:
[指针变量类型] *[指针变量名];
如果要声明一个int* 型指针变量pt时,则有以下代码:
int *pt;
以此类推,其他类型指针变量声明不再一一赘述。
使用C语言指针
为了使用指针,c语言提供了两个特别的运算符——
取址运算符 &
取值运算符 *
在定义了一个指针变量后,只为其分配了相应的内存单元用于存放指针的值,而这个指针变量并没有指向某个特定的变量,因此在使用指针时,也需要将指针变量进行初始化。
因为指针变量存放的是变量的地址,因此对指针初始化就是将某个变量的地址赋给它。这个过程需要取址符&的帮助。
如下面的程序:
int x=5;
int *p=&x;
//将x的值赋予给p
也可以写成另一种形式:
int x=5,*p=&x;
上面两段代码效果与目地是一样的。
在输出p的值时要用到取值*:
printf(“%d”,*p);
深入学习
假设有以下程序代码:
int a=3;
int b=5;
int *p1=&a;
int *p2=&b;
p1=p2;
(1)声明两个整型变量,a的值为3,b的值为5
整型数值3
变量a
整型数值5
变量b
(2)将变量a,b的内存地址分别存储到p1与p2中
变量a
指针p1
变量b
指针p2
此时p1指向a,p2指向b
变量a 指针p1 把内存地址给p1 指针指向a 变量a 指针p1
变量b 指针p2 把内存地址给p2 指针指向b 变量b 指针p2
(3)将p1指向的地址修改为p2指向的地址
p1: F74EC7F7
p2: F74EC7F9
在这里大家可能会有些许迷惑,且听我道来。
我们在此要区分两个语句
p1 = p2;
这里没有取值符*,两者都为指针自身,将p1指向的内存地址修改为p2所指向的内存地址
* p1 = * p2;
有取值符*,代表是将p1指向内存地址的值修改为p2指向内存地址的值
p1=p2释图
未执行前:
p1
F74EC7F7
p2
F74EC7F9
当执行该语句后:
F74EC7F7
p1
F74EC7F9
p2
*p1 = *p2释图
未执行前:
p1
F74EC7F7
3
p2
F74EC7F9
5
执行该条语句后:
p1
F74EC7F7
5
p2
F74EC7F9
5
↓↓↓↓↓
p1
F74EC7F7
5
p2
F74EC7F9
5
现在大家明白了吗?没有没白没关系,还有第三章呢!
(未完待续…)