提示:
一、心理因素很重要。一定不要觉得指针很难,这会影响到你对它的理解,它并不难,它特别简单,就想吃饭一样(自我催眠一波 走起~)。
二、将 int * p; 把 int* 看作一个整体,当作一个新的数据类型,整型指针类型,根据 类型名的改变而改变。
一、变量的地址和指针
1、变量及其地址
-
在C程序中要定义许多变量,用来保存程序中用到的暑假,包括输入的原始数据,加工的中间结果及最终数据。C编译系统会根据定义中变量的类型,为其分配一定字节数的内存空间(如字符型占1个字节,整型占4个字节,实型占4个字节,双精度型占8字节等),此后这个变量的地址也就确定了。
-
C语言规定,当一个变量占用一个字节时,该字节的地址就是该变量的地址,如果变量占用连续的多个字节,那么第一个字节的地址就是该变量的地址。
-
变量的地址起到了寻找变量的作用,好像是一个指针指向了变量,所以常把变量的地址称为“指针”。
2、指针变量概念(很重要)
若一个 变量 专用于 存放另一个变量的地址(指针),则该变量称为指针变量。(将指针的概念搞清楚之后,对于后续指针相关操作会更容易)
3、指针对象
当把 变量的地址 存入 指针变量 后,我们就可以说这个指针指向了该变量 。
在C程序中,变量的地址可以 通过运算符 “&” 来得到,该运算符称为 “取地址符” 运算符,它的运算对象是 变量 或 数组元素,得到的 结果 是变量或数组元素的 地址 。
int a,b[10];
&a; // 得到的a的地址
&b[5]; // 得到的是数组元素 b[5]元素 的地址
二、指针变量的定义和指针变量的基类型
1、指针变量的定义和初始化
-
定义指针变量的一般形式为:
-
类型名 * 指针变量名1,* 指针变量名2,...;
-
其功能是定义指向给定 "数据类型"的变量或数组元素的指针变量,同时给该变量赋 "初始值"。存储类型指出该变量的存储类型。
int *pa,*pb;
int a = 10,b = 12;
pa = &a // pa 取 a 的地址 的值,初始化
pb = &b // pb 取 b 的地址 的值,初始化
-
定义时也可以给其赋初始值,格式为:
-
类型名 * 指针变量名[=初始值];
-
例如: int * pi, * pi = &a;
int a = 10;
float b = 1.2;
int * pa = &a;
float * pb = &b;
三、给指针变量赋值
1、给指针变量赋地址值(方式有三种)
-
(1) 通过求地址运算(&)获得地址值
-
一般格式为:指针变量名 = 地址表达式
-
例如:int k , * p , * q ; q = &k; ( "&" 为求地址运算符 )
-
此时,变量k的地址赋予了q,也可以说p指向了k。
#include<stdio.h>
main()
{
int k = 10;
int * q;
q = &k;
printf("%d",*q); // 结果为 10, * 的作用是取该地址的值
}
-
(2)通过指针变量获得地址值
-
可以通过赋值运算,把一个指针变量中的地址值赋给另一个指针变量,从而使这两个指针变量同一地址。例如,若有以上定义,则语句:
-
p = q
-
使指针变量p中也存放了变量k的地址,也就是说指针变量 p 和 q 都指向了变量k。
-
注意:在赋值号两边指针变量的基类型必须相同。(都要是int * 类型的)
#include<stdio.h>
#include<stdlib.h>
main()
{
int k = 10;
int * q;
int * p;
q = &k;
p = q; // 将q的值赋值给p,p == &k
printf("p = %d",*p); // p 等于 10
// 暂定... 需要额外导入 第二个头文件
system("pause");
}
(3)通过标准函数获得地址值 --- 不熟悉,不常用(可能吧)
2、给指针变量赋"空"值
- 除了给指针变量赋值地址值外,还可以给指针变量赋NULL值(一定要大写)。
- 例如:p = NULL;
- NULL 是stdio.h 头文件中的预定义符。NULL的代码值为0,当p = NULL 时,称p为空指针。因为NULL的代码值为0,所以上面语句等价于:
- p = '\0'; 或 p = 0;
- 这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值---“空”。企图通过一个空指针去访问一个存储单元时,将会得到一个出错信息。
#include<stdio.h>
main()
{
int a = 10;
int * p;
p = NULL;
*p = 10; // 报错
}