指针指针,顾名思义就是有指向之类的意思
前情提要:1.指针就是内存地址,使用指针访问变量,就是直接对内存中的数据进行操作
2.指针实现间接访问,指针并不是用来存储数据,而是存储数据在内存中的地址
因此可以通过访问指针达到访问内存中数据的目的
指针类型:初级的:int* float* char*等明显的指针
高级的:指针数组 存放指针的数组:int*arr[3] (整型指针数组,同理
char*arr[[3],float*arr[3]一样)
数组指针 指向数组的地址 int(*arr)[3]
下标指针*(p+i) (与数组有联动)
缝合怪(后续会细讲):int(*arr[10])[10]//大家可以猜一下,文章末有答案
不难看出*是判断是否为指针类型的标志。
注意:1.决定了指针解引用的的权限大小
2.决定了指针的步长(指针的类型大小,int为4字节)
指针指向类型:举个栗子:int*arr//整型指针,指向类型为int
因此其余同理。
小练习 1 尝试写出pa与pa+1,pc与pc+1之间的差值(文末先有思路,最后有答案)
int main()
{
int a[10] = { 0 };
int* pa = a;
char* pc = a;
printf("%p\n", pa);
printf("%p\n", pa + 1);
printf("%p\n", pc);
printf("%p\n", pc + 1);
return 0;
}
指针大小:32位平台指针大小为4字节,64位则为8字节
判断系统:printf("%d\n",sizeof(int*));
指针运算:指针与整数的运算(可以提供练习1的思路)
基础:指针p+n或p-n,表示p向地址增加或减少的方向移动n个字节大小,得到一个新的地址,使其能访问新地址中的数据。字节大小取决于指针的数据类型。(所以再看看前面的练习吧)
加试1:(这可没答案哦,自己调试看看吧)
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
int* p1 , *p2;
p1 = &a;//& 是取地址符号,取的是地址
//*是解引用符号,取p指针指向的地址的值,指针指向内容(* 在定义指针变量时是指针标志)
p2 = &(*(a+5));//扩展:*(a+5)=a[5] 也是跟地址有关哦
printf("p1存储的值:%d\n", *p1);
printf("p2存储的值:%d\n", *p2);
printf("p1-1存储的值:%d\n", *(p1+1));
printf("这又是什么呢%d\n", *p1-1);
printf("这呢:%d\n", *(p1 + 3));
printf("这个呢:%d\n", *p1 + 3);
//如果换成char的话,字节大小就会变成1,后面会有更多内容
return 0;
}
指针与指针的运算
注意的是,指针与指针之间没有加,只有减(因为减号可表示加上一个负号,硬要问为什么的话,去百度看一下吧)
指针减指针,地址减地址,16进制数减16进制数,就是一个数字
即两个指针在内存中的距离,以数组元素的长度为准(int4个字节)
练习2:pa1与pa差多少字节,之间距离是多少,pa3与pa2呢
int main()
{
int a[10] = {0};
int* pa = a;
int*pa1=&(*(a+5));
printf("%p\n", pa1);
printf("%p\n", pa);
printf("%d\n", pa1 - pa);
char b[10] = { 0 };
char* pa2 = b;
char* pa3 = &(*(b + 5));
printf("%p\n", pa2);
printf("%p\n", pa3);
printf("%d\n", pa3 - pa2);
return 0;
}
&与*
由之前学习,已经对这两个操作符有所理解了
单目操作符 & 取地址,用于取出变量的地址
单目操作符* 解引用 ,用于访问指针所指向的变量(注意是不是定义指针变量)
(所有操作符都有一个注意的点,优先级)*p++=*(p++) *与++优先级相同,自右向左
注意
1.有取有解:&与*,如果指针存储了值,要间接访问获得值
2.指针必须初始化:对未初始化的指针变量执行间接访问是非法的
3.指针类型大小:主要注意运算的指针类型大小
课后练习:
1.输入两个整数,存储在变量a和b中,通过指针输出他们在内存中的地址
2.输入三个整数,存储在变量a,b和c中,用这3个变量对3个指针进行赋值
3.输入两个整数,存储在变量a和b中,通过指针改变变量a和b的值并输出改变后它们的值
4.输入两个整数,存储在变量a和b中,当a小于b时,使用指针交换a和b并输出
答案:
int(*arr[10])[10]
存放数组指针的数组
arr[10]表示数组
int(* )[10] 表示数组指针
数组有10个数组指针
每个数组指针指向一个数组,有10个 int元素
练习1
int main()
{
int a[10] = {0};
int* pa = a;
char* pc = a;
printf("%p\n", pa);
printf("%p\n", pa+1);//加一个整型
printf("%p\n", pc);
printf("%p\n", pc+1);//加一个字符
return 0;
}
练习2
int main()
{
int a[10] = {0};
int* pa = a;
int*pa1=&(*(a+5));
printf("%p\n", pa1);
printf("%p\n", pa);
printf("%d\n", pa1 - pa);//字节大小为4
char b[10] = { 0 };
char* pa2 = b;
char* pa3 = &(*(b + 5));
printf("%p\n", pa2);
printf("%p\n", pa3);
printf("%d\n", pa3 - pa2);//字节大小为1
return 0;
}