【笔记】第八章 指针(C语言)
第八章 指针一 指针变量定义
C语言的两种变量:
变量(普通变量)存储内容值
地址变量(指针变量)存储地址值
1. 格式
类型名 *指针变量名;
注:
(1)定义变量(普通变量, 指针变量)都必须在前面有类型名
(2)在定义指针变量时, 指针变量名前的"*"表示现定义的是一个指针类型的变量. 星号并不是指针变量名的一部分, 只是一个标志
(3)指针变量专门来存地址, 禁止将一个整型值直接赋给一个指针变量
2. 指针变量的引用
"&"取地址运算符, 通过&运算符可以取出普通变量的地址
"*"指针运算符, *可以取出指针变量所指向的普通变量的值(间接引用普通变量)
注:
(1)可以通过赋值使一个指针变量“指向”某一普通变量(指针变量=&普通变量)
(2)在C语言中正确的做法是先让指针变量指向一个确定的存储单元后, 再通过该指针变量引用它所指向的存储单元
(3)变量名(普通变量 指针变量)都表示其存储单元内的值
p1=p2; /*p1指向了p2 所指向的单元*/
(4)若指针变量p指向变量a, 即将变量a的地址赋给了指针变量p
如: int a=20, *p=&a;
则有下列结果:
A *p<=>a
B p<=>&a
C &*p〈=〉&a〈=〉 p &与*互逆
D *&a <=> *p<=>a
E (*p)++ a++ 都是给变量a的值加1。
(*p)-- a--
++(*p) ++a ++*p
--(*p) --a --*p
(5)所有的指针变量在内存中分配的字节数相同 sizeof()
int *p int是指针所指向内容的类型
口诀:
地址变量得地址, 得谁地址指向谁
内容变量画房子, 指针变量画指向
有*为内容值, 不是读就是写, "="左边为写,其他都是读
无*为地址, 地址赋值改指向
二 一维数组与指针变量
1. 指向数组元素的指针变量
由于数组元素与普通变量一样, 所以定义指向数组元素的指针变量与定义指向普通变量的指针变量完全一样
2. 指向一维数组的指针变量
注:
(1)在C语言中规定, 数组名代表数组的首地址, 而且是一个地址常量
(2)当指针变量指向数组中某个元素时, 指针变量加1后指向数组的下一个元素, 指针变量减1指向数组的前一个元素
(3)地址三等价 元素四等价
int a,*p=a;
p+i a+i &a
*(p+i) *(a+i) a p
当指针变量指向数组时, 下标运算([ ])用于数组也可用于指针变量后
a) *(p+i) *(a+i) a p
b) p++ ++p p+ 1 =1 p=p+1
c) p-- --p p-=1 p=p-1
d) *p++ *(p++) *p-- *(p--) 指针加减
e) *++p *(++p) *--p *(--p)
f) (*p)++ ++(*p) ++*p 内容加减
g) (*p)-- --(*p) --*p
(4)若两个指针变量指向同一个数组, 则这两个指针变量可以进行大小比较
(5)在形参中的数组实际上是一个指针变量, 并不是真正的数组, 因为该“数组名”的值是可以改变的, 而真正的数组名(指针常量)的值是不能改变的。
(6)若形参是数组或指针变量, 则在函数中可以通过该形参改变实参的值
三 多维数组与指针变量
若a是一个二维数组,则有:
(1) a+i是行指针, 即指向的是一整行. 若对它加1则指向下一行
(2) *(a+i) 和a一样, 都是一个列指针即指向的是一个元素
(3) *(a+i)+j和a+j一样, 都表示元素a的地址. 即与&a等价。
*(a+i)+j a+j &a 地址三等价
(4) *( (a+i)+j) *(a+j) *(a+i))和a一样, 都表示元素a 元素四等价
1. 指向多维数组元素的指针变量
如:
int a;
int *p=&a;
则:
p+1指向元素a
p+4指向元素a
p-2指向元素a
常用于取二维数组a元素地址的方式:
&a a+j *(a+i)+j
a<=>&a
2. 指向由m个元素组成的一维数组的指针变量
格式:
类型名 (*指针变量名) ; m为列数
行指针变量
四 指向字符串的指针变量
字符串常量: C语言对字符串常量是按首地址处理字符串常量
"China" 为地址值
char *p = "China";
五 指向函数的指针变量(函数指针)
函数名与数组名一样, 是起始地址, 而且是一个地址常量
格式:
类型名 (*指针变量名) (形参列表);
注:
(1)“(*指针变量名 )”中的括号不能省, 括号改变了运算符的优先级. 若省略整体则成为一个函数说明, 说明了一个返回的数据类型是指针的函数, 后面的“形参列表”表示指针变量指向的函数所带的参数列表, 可写可不写,但若不写某些编译器不通过
(2) 单独的函数名代表该函数的首地址(函数的入口地址)
(3) 函数的指针变量只能指向函数的入口处(函数的首地址), 不能指向函数中的某条指令. (另对指向函数的指针变量加1是没有意义的)
(4) 给指向函数的指针变量赋值时, 只写函数名即可, 不必写参数
类型名(*指针变量名)( ); 函数指针
类型名 普通变量名; 变量
类型名 数组名[]; 数组
类型名 *指针变量名; 列指针
类型名 函数名( ) 函数定义
{......}
类型名 (*指针变量名); 行指针
六 返回指针的函数(指针函数)
函数定义:
类型名 函数名(形参)
{ }
返回指针的函数的定义:
类型名 *函数名(形参列表)
{ }
七 指针数组和指向指针的指针变量
1. 指针数组
定义:若一个数组的所有元素均为指针类型(地址), 则称为指针数组
格式:
类型名 *数组名[常量表达式];
int *s;
注:
(1)要注意它与定义指向由m个元素组成的一维数组的指针变量之间的区别
类型名 *数组名[常量表达式];
类型名 (*指针名)[常量表达式m];
(2)它的每个 个 类 元素都是一个指针类型(地址), 即它的每个元素都相当于一个指针变量
2. 指向指针的指针变量
定义: 用来存放指针变量地址的指针变量称为指向指针的指针变量
格式:
基类型名 **指针变量名;
八 空指针
指针变量可以有空值,即指针变量不指向任何变量,不指向任何有用的存储单元。
在系统中已将NULL定义为0,即NULL的值为0
int a,b,c,*p=NULL;
此时p 的值为空指针, 即p不指向任何有用的存储单元. 尽管NULL的值为0, 但我们不能认为p指向了地址为0的存储单元
注:
(1)当一个指针变量的值为空指针时,我们不能引用它所指向的存储单元。
(2)若某指针(地址)的基类型为void型,则有引用时应进行相应的强制类型置换
【笔记】第七章 函数与预编译(C语言)
http://www.52pojie.cn/thread-629758-1-1.html
【笔记】第六章 数组(C语言)
http://www.52pojie.cn/thread-629287-1-1.html
【笔记】第五章 循环结构(C语言)
http://www.52pojie.cn/thread-628823-1-1.html
【笔记】第四章 选择结构(C语言)
http://www.52pojie.cn/thread-627932-1-1.html
【笔记】第三章 顺序结构(C语言)
http://www.52pojie.cn/thread-627411-1-1.html
【笔记】第二章 C语言组成及数据
http://www.52pojie.cn/thread-627006-1-1.html
【笔记】第一章 C语言基础知识
http://www.52pojie.cn/thread-626978-1-1.html
> (3)指针变量专门来存地址, 禁止将一个整型值直接赋给一个指针变量
通过强制转换即可,比如说void* p = (void*)12324
另外*和++、--运算符的顺序要注意,*p++和*(p++)是不一样的。 cqr2287 发表于 2017-7-30 18:51
好呀!楼主这个笔记对应的是谁的教程呢?为何不创建一个专辑来收这些帖子以获取奖励呢?
补充:以后每次 ...
赵海英老师的视频教程 可以!很强势!认真的劲值得学习! 本帖最后由 cqr2287 于 2017-7-30 18:57 编辑
好呀!楼主这个笔记对应的是谁的教程呢?为何不创建一个专辑来收这些帖子以获取奖励呢?
补充:以后每次出笔记的时候我都给你加分呦~~如果我没来就@我哦~~ 学习一下 哎呦不错哦。比我整理的全。。而且。。。我还没掌握呢。。 非常感谢分享啊,多少年了指针这一块总是晕晕乎乎的 正在学这个。。。 很不错,支持楼主
页:
[1]
2