文章目录
一、基本定义
指针:数据在内存中的地址。
指针变量:存放指针的变量,本质上是一个整数。
指针所指向的值,可以是任何类型数据,如数组、字符串、函数或普通变量、指针变量。
二、指针变量使用
1、定义
定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号*
datatype *name;
或者
datatype *name = value;
*
表示这是一个指针变量,表示该指针变量所指向的数据的类型 。
int *p1;
p1 是一个指向 int 类型数据的指针变量,至于 p1 究竟指向哪一份数据,由赋予它的值决定。再如:
int a = 100;
int *p_a = &a;
2、多次写入
和普通变量一样,指针变量也可以被多次写入。随时都能够改变指针变量的值。
//定义普通变量
float a = 99.5, b = 10.6;
char c = '@', d = '#';
//定义指针变量
float *p1 = &a;
char *p2 = &c;
//修改指针变量的值
p1 = &b;
p2 = &d;
3、连续定义
指针变量也可以连续定义,注意每个变量前面都要带*
int *a, *b, *c; //a、b、c 的类型都是 int*
4、 通过指针变量取得数据
指针运算符:*
,可以获取指针指向地址里的值。
*pointer;
使用
#include <stdio.h>
int main(){
int a = 15;
int *p = &a;
printf("%d, %d\n", a, *p); //两种方式都可以输出a的值 15, 15
return 0;
}
5、修改内存数据
int a = 15, b = 99, c = 222;
int *p = &a; //定义指针变量
*p = b; // 通过指针变量修改内存上的数据,将 b的值付给了 p 指向地址的值,顾 a = 99
c = *p; //通过指针变量获取内存上的数据
printf("%d, %d, %d, %d\n", a, b, c, *p); // 99, 99, 99, 99
*p
代表的是 a 中的数据,它等价于 a,可以将另外的一份数据赋值给它,也可以将它赋值给另外的一个变量。
三、* 和 & 小结
1、*
的使用
把地址赋值给指针变量时,p 前面没有 *
。
将数值 赋值给指针所指向的地址时,p 前面需要 *
。
如:
int *p;
p = &a; // p 前面就不能加*。
*p = 100;
2、 * 和 & 的混合使用
-
*&a
可以理解为*(&a)
-
&a
表示取变量 a 的地址(等价于 pa) -
*(&a)
表示取这个地址上的数据(等价于*pa
),绕来绕去,又回到了原点,*&a
仍然等价于 a。 -
&*pa
可以理解为&(*pa)
-
``*pa`表示取得 pa 指向的数据(等价于 a)
-
&(*pa)
表示数据的地址(等价于 &a),所以&*pa
等价于 pa
四、指针变量的运算
1、加减
指针变量加减运算的结果跟 数据类型的长度有关
#include <stdio.h>
int main(){
int a = 10, *pa = &a, *paa = &a;
double b = 99.9, *pb = &b;
char c = '@', *pc = &c;
//最初的值
printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c);
printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
//加法运算
pa++; pb++; pc++;
printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
//减法运算
pa -= 2; pb -= 2; pc -= 2;
printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
//比较运算
if(pa == paa){
printf("%d\n", *paa);
}else{
printf("%d\n", *pa);
}
return 0;
}
&a=0X28FF44, &b=0X28FF30, &c=0X28FF2B
pa=0X28FF44, pb=0X28FF30, pc=0X28FF2B
pa=0X28FF48, pb=0X28FF38, pc=0X28FF2C
pa=0X28FF40, pb=0X28FF28, pc=0X28FF2A
2686784
不要尝试通过指针获取下一个变量的地址
2、比较
比较的是数据的地址
不能对指针变量进行乘法、除法、取余等其他运算,除了会发生语法错误,也没有实际的含义。