指针就是地址。
地址:在内存空间中,以字节作为基本单位,每一个字节都有自己独一无二的编号,这个编号就是地址。
指针变量:存放地址编号的变量
通常我们在不影响理解的情况下,把地址、指针变量都叫指针。
指针变量一般形式:
存储类型 数据类型 *变量名;
eg:
int a =10;
int*p;
p =&a;
char ch;
char*p =&ch;
&取地址 *取内容
int a =10, b =20;
int*p =&a; // 指针p 指向 a对应空间
p =&b;// 更改指针p的指向 *p =20; // 修改p指针指向空间的内容
大端序小端序
大端序:低位数据存在高地址
小端序:低位数据存在低地址
指针的运算
指针的偏移操作
p + n:以p指针存的地址编号为基准,往高地址方向,偏移n个元素(偏移字节数: 偏移的元素个数 *元素大小小)
p - n:以p指针存的地址编号为基准,往低地址方向,偏移n个元素(偏移字节数: 偏移的元素个数 *元素大小小)
p++:以p指针存的地址编号为基准,往高地址方向,偏移n个元素(偏移字节数: 偏移的元素个数 *元素大小小) ,最后更改指针的指向为偏移后的地址
p--:以p指针存的地址编号为基准,往低地址方向,偏移n个元素(偏移字节数: 偏移的元素个数 *元素大小小) ,最后更改指针的指向为偏移后的地址
q - p:结果为中间间隔的元素个数
关系运算: ><>=<===!=
逻辑运算: NULL 假 非NULL 真
NULL:是零地址的宏
[]:变址运算符
*(p + i)== p[i]
p[1]=*(p +1)&*: 互为逆运算
int a =10;
int*p;
p =&a;
*(&a) ==10== a
指针和一维数组的关系
一维数组的数组名,代表数组首元素的地址
注意:数组的首地址是一个常量,不能被修改
int a[5]={10,20,30,40,50};//定义一个指针指向,一维数组的首元素int*p =&a[0];int*p;
p = a;
p[i]==*( p + i )== a[i]==*(a + i)int a[5]={10,20,30,40,50};int b[5];
练习
1.利用指针实现对数组元素求和
(1)
int a[5]={10,20,30,40,50};int*p = a;int sum =0, i;for(i =0; i <5; i++){
sum += p[i];}printf("%d\n", sum);
(2)
int a[5]={10,20,30,40,50};int*p = a;int*q =&a[4];int sum =0, i;while(p <= q){
sum +=*p++;}printf("%d\n", sum);printf("%p\n",&a[4]);printf("%p\n", p);