指针初阶——内存地址

发布于:2022-12-09 ⋅ 阅读:(562) ⋅ 点赞:(0)

                 指针指针,顾名思义就是有指向之类的意思

前情提要: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;

}

 


网站公告

今日签到

点亮在社区的每一天
去签到