前言:
指针的定义:一个变量在内存中占用存储空间的起始地址称为该变量的指针。
指针变量:如果一个变量专门来存放其他变量的指针,那么就称这个变量为指针变量。
引入指针的目的:通过指针来访问指向的数据对象。
理解指针具体含义:
1、指针变量和普通变量的区别:指针变量存放的是 一个其他变量的首地址,普通变量存放的是 实际的值。
*:取地址:举例:p是指针变量,p存放的地址是 ox2237,*p就是取到,p所存放地址(ox2237)位置上的值。
该图 *p 取到的值为 10。
提到这,我便思考到 如果一个普通变量 存放的是地址值,如果用 该变量前 加 * ,是否会达到和指针一样的效果
代码:
#include <stdio.h>
void main(){
int a = 10;
int b = &a; //6487580 a的地址
printf("%d", *b);
}
按照我所思考的逻辑:此时应该输出 10,但是一行醒目的红色出来了
哦吼,原来如此,如果变量要使用 * 的话,前提:该变量声明必须是 指针变量,所以 普通变量无法实现指针变量的功能!
指针的赋值:
-
指针变量的赋值,也只能赋 变量 的地址值。(注:不允许将常量或者一个非地址表达式来给指针赋值)
int i,*p;
i = 10; // 初始化 i
p = null; //正确
p = 67; //错误
p = i+5; //错误
p = &i; // 正确,&i 是取i变量的地址
指针的算术运算:
-
++(自增)、--(自减)。指针变量的值增1或减1,指针变量指向相邻的后一个元素或者前一个元素
-
加、减整型数据。指针加( 或减 )一个整数,结果还是一个指针,是向后(或前)偏移所加(或减)整数个元素的指针。
-
两个指针相减。两个指针相减的结果是一个整数。
指针相减是有条件的:这俩个指针指向同一个数组中的元素。指针的差值即两个指针相对偏移的元素的个数。
#include <stdio.h>
void main(){
int a[6]={0,1,2,3,4,5};
int *p1,*p2;
p1 = &a[0];
p2 = &a[5];
printf("%d",p2-p1);
}
输出:
指针的比较运算:
指向同一个数组的俩个指针可以进行关系运算
-
当 p1,p2指向同一个元素时,p1 ==p2 为真,否则为假
-
当 p1,p2是指向同一个数组的两个指针变量,p1指向的数组元素在p2指向的元素之前,则表达式 p1<p2 为真,否则为假
在一个不指向任何数组元素的指针上执行算术运算会导致未定义的行为。
在使用指针变量时,要注意以下几点:
1、指针变量可以自增、自减,而数组名不可以自增、自减。
原因:数组名是数组的首地址,它的值在程序运行期间固定不变,是常量。
2、注意指针变量的当前值。
数组循环时,指针依次指向数组中的每个元素。循环结束时,指针变量指向数组以外的单元了。
3、注意防止下标越界
二维数组指针
二维数组指针有两种:① 元素指针。整型元素 xx[i][j] 的指针 &x[i][j] 或者 x[i]+j。② 行指针。
-------
已知 x[i][j]; 可得: x+i 是元素 x[i] 的指针,*(x+i)是 x[i],x[i]+j 是元素 x[i][j] 的指针,所以 *(x+i)+j 是元素 x[i][j] 的指针,*(*(x+i)+j) 就是数组元素 x[i][j]。
切记,行指针前加 * ,是该行 0 元素的指针。
指针数组和数组指针:
指针数组:由指向同一类型数据的指针作为元素组成的数组称为指针数组。一般形式为:
类型 *数组名[数组长度]
数组指针:指向数组的指针。一般形式为:
类型 (*指针名称)[m]