当前课程知识点:高级语言程序设计 > 指针 > 6.3 指针变量的定义、赋值与使用 > 指针变量的定义、赋值与使用
大家好 本节课
我们学习指针的定义 赋值和使用
我们先来看看指针变量定义的一般形式
指针定义的一般形式是这样的
type * 标识符 ;
或者type (*标识符)
比如 int *p;
这就是定义的一个指针变量p
double *q;
char *s;
这都是定义得指针变量
注意这里的type可以是基本类型
也可以是构造类型
比如说数组
比如说后面我们要学的结构体 共用体等等
也可以是函数类型
甚至是指针类型
比如我们看看下面的例子
int (*p)[10];
这里就定义了一个指针变量p
这是一个指向一维数组的指针
int *(*q);
这也是一个指针
这是指针的指针
int *在这里就是一种类型
q是指针的指针
这一句也可写为int **q
还有int (*func)(int,int);
这也是指针变量
*func这也是定义一个指针变量
这是指向函数的指针
因为int (int,int)这是一种类型
只要在中间填上标识符
比如max它就变成了int max(int x,int y)
它就是一个函数
函数名max
所以在这里这个指针变量是指向函数的指针
我们通常称为函数指针
这是指针的定义
下面我们看一看指针变量的赋值
指针变量定义后
我们就可以给指针变量赋值了
指针变量的赋值
它不同于我们前面学习的数据
变量的赋值
要注意以下几点
一给指针变量赋的地址值
必须是经过操作系统分配的地址
二指针变量的值
也就是这个地址值的类型
要与赋值的地址的类型要匹配
如果不匹配的话
翻译程序是会报错的
三给指针变量赋值的时候
我们可以赋一个空地址值NULL
我们看看下面的指针赋值
也就是初始化是合法的
看第一个例子
int a,*p;
然后P=&a;
这是合法的
再看第二个例子
int a,*p=&a;
这是在定义的时候初始化
和1的例子效果是一样的
再看第三个例子
int *p;
p=NULL;
那么再看看第四个例子
int *p,*q,a[10];
p=a;
q=p;
这也是合法的
因为a是数组的首地址
数组中的元素是int类型
所以把a的值赋值给p
再赋值给q是合法的
下面看看给指针赋值
或者初始化不合法的情形
看看int a,*p;
p=a;
这是不合法的
因为这里的a放在赋值符号的右边
代表a的值
a这个时候我们还没有给它赋值
即使给a赋了值
这个值也不是经过操作系统合法分配的地址值
所以这是不合法的
再看六
int a,*p=a;
这和刚才的五情形是一样的
这里把a赋值给p
这是个初始化
a赋值给p
那么再看看七
int *p;
p=1000;
这也是不合法的
因为1000把它作为地址值
是没有经过操作系统分配的
那么未经操作系统分配的地址值是不合法的
再看看八
int a,*p,**q;
p=&a;
这个是合法的
我们再把p送给q
这是不合法的
为什么
因为p放在赋值符号的右边
代表p的值
P的值就是a的地址
那么a的地址
它的类型是int类型
因为这个地址经过翻译程序访问
是一个int类型的数据
*q是指针的指针
q应该是某一个int类型的指针的地址
所以这里面把p值赋值给q
两个地址类型是不匹配的
所以是不合法的
如何来用指针变量
由于指针变量的值是地址
所以对指针变量的使用
就涉及到是使用指针变量本身
还是使用把指针变量的值取出来
再访问一次的数据对象
也就是它指向的对象
那么我们看一个例子
int a,*p=&a,*q;
q=p; //使用p
这个时候使用的是p的值
把p的值送给了q
然后*p=6;
这是可以的
因为p的值就是a的地址
*p代表p指向的对象
p的值就是a的地址
*p指向的对象就是a
把6赋值给a
当然就是合法的
但是在这里我们就看到了
一个是使用指针变量本身p
另外一个是使用p指向的对象*p
因此我们对指针变量的使用要区分这两种情况
是使用它本身还是使用指向的对象
用p指向的对象在这里就是a
它是a的另外一种访问方法
那么指针指向的对象就是*加指针变量名
这样,我们把刚才说的意思做一个总结
对指针的使用要区分
一个是使用指针变量本身
还是使用它指向的对象
如果是使用指针变量本身
那就是只有一个指针变量本身名称
比如刚才的p
如果是使用指针指向的对象
不光要有指针变量名
在它的前面还要带上*才代表指向对象
那么我们使用指针指向的对象的时候
那要遵循指向的对象所属的类型的使用方法
也就是使用
这个
下面我们来看一个例子
那么定义两种指针变量
并且用指针的方法来访问数据
通过这个例子
我们来巩固一下对指针变量的使用
那么这个程序的代码是这样的
#include
int main()
花括号里面是定义的一般的整型变量
a以及指向一般整型变量的指针变量p
还有字符变量ch
以及指向字符类型的指针变量q
我们把a的地址送给p
那么请注意这里
p的值今后就是a的地址了
就是那么*p就是a了
凡是a出现的地方
我们都可以用*p来替换
把ch的地址送给q这是合法的
那么q的值就是ch的地址
*q今后访问的就是ch
因为q是CH的地址
q指向的对象就是ch
也就是说今后凡是ch出现的地方
我们可以用*q替换
比如我们看看把7复制给*p
那实际上等效于把7送给a
把字符a复制给*q
那实际上就等效于把字符a送给ch
这里*q是ch的另外一种访问方法
那么*p除以2的余数在赋值这个*p
那实际上他这里就是a除以2的余数赋值给a
*q加上32赋值给*q
那就是ch的值加上32送给ch
好下面我们输出a的值
ch的值是多少
注意在这里输出的时候
我们是用*p代表a的值
*q代表ch的值
那么我们看看输出的结果
大家会发觉a的值输出来就是1
那么ch的值是小写的a
那么和我们的这个验证的效果
就是*P代表的访问就是a
*q实际上访问的就是ch
这样我们把指针变量的使用
在这里我们就讲完了
好
这节课就讲到这里
谢谢大家
-1.1 计算机程序和计算机语言
-1.2 C程序的构成
--C程序的构成
-1.3 C语言编辑、编译、运行(VC++2010学习版)
-练习题
-2.1 变量的定义和使用
--变量的定义和使用
-2.2 数据类型
--数据类型简介
--整型数据
--实型数据
-2.3 格式输出和格式输入
-2.4 运算符和表达式
--运算符和表达式
-2.5 结构化程序设计入门
-练习题
-3.1 为什么要用选择结构解决问题
-3.2 如何正确表示选择结构中的条件
-3.3 用if语句及if语句嵌套实现选择结构
-3.4 用switch语句实现选择结构
-练习
-4.1 循环的引入
-4.1 循环的引入--作业
-4.2 用while语句实现循环
-4.3 用do-while语句实现循环
-4.4 用for语句实现循环
-- 用for语句实现循环
-4.4 用for语句实现循环--作业
-4.5 何时需要用循环的嵌套
-4.6 如何提前终止循环和提前结束本次循环
-习题--作业
-5.1 数组类型的引入
--数组类型的引入
-5.2 一维数组的定义和初始化
-5.3 一维数组的使用
--一维数组的使用
-5.4 二维数组的定义和初始化
-5.5 二维数组的使用
--二维数组的使用
-习题--作业
-6.1 什么是指针
--什么是指针
-6.2 指针类型及相关概念
-6.3 指针变量的定义、赋值与使用
-6.4 指针的运算
--指针的运算
-6.5 指针与一维数组
--指针与一维数组
-6.6 指针的指针
--指针的指针
-6.7 指针与二维数组
--指针与二维数组
-习题--作业
-7.1 为什么要自定义函数
-7.2 函数的定义
--函数的定义
-7.3 函数的调用
--函数的调用
-7.4 函数参数的传递
--函数参数的传递
-7.5 函数的嵌套调用和递归调用
-7.6 变量的作用域和存储类型
-习题--作业
-8.1 字符串的存储及输入输出
-8.2 系统字符串处理函数
-8.3 自定义字符串处理函数
-习题--作业
-9.1 结构体类型的定义
--结构体类型的定义
-9.2 结构体变量及指针变量的定义及使用
-9.3 结构体变量和指针变量作函数的参数
-9.4 结构体数组的定义和使用
-9.5 共用体类型和枚举类型
--共用体和枚举类型
-习题--作业
-动态内存分配--习题
-习题--作业