【c语言】——关于指针的那些事儿

xiaoxiao2025-11-11  8

说到指针,想必大家为此还是比较头疼吧,在一个具体的问题中老是被它搞得头昏脑涨,那么,今天,小编就带你来好好的了解一下这个神秘的它吧~

一、指针的定义

1、指针的实质 指针的本质上就是一个地址,指针就比别的多了一个解引用,即*可间接访问他人。 2、关于指针的操作

int a=10; int b=20; int *p=&a; *p=100; //a=100&a,表示获取a的地址(指针) p=&b;//p=2000 *p=200;//b=200,*p 表示解引用 int **pp=&p; *pp=&a;//p=&a **pp=1000;a=1000 *pp=&b;//p=&b **pp=2000; //b=2000

3.指针赋值 类型不同不可以赋值,指针赋值一定要严格相等 char a=‘x’; char *p1=&a; short b=10; short *p2=&b; int c=20; int *p3=&c; int *p4=&p3;

二、指针的运算

1、指针++的三种情况 第一种:加一个字节 第二种:加一个格子(4个字节) 第三种:加一个数组 那么到底是属于哪种情况呢,我们来做以下分析: 输入一段代码

#include<stdio.h> int main() { int arr[10]={1,2,3}; int *p=arr; p++; *p=10; printf("%d %d\n",arr[0],arr[1]); return 0; }

1、如果是第三种情况加一个数组,p++就直接加到了本数组结束位置,但是本操作是对数组内部数据的操作,所以这种推测错误。 2、如果是第一种情况,加一个字节,由于一个指针占4个字节。那么如下图所示,把有色方框放大得到。 十进制 1 转成十六进制为 ox1 ox00000001 同理2 转成十六进制为 ox2 ox00000002 101 转成十六进制为 oxa ox0000000a 因为PC为小端(低地址放小数据),所以将图中每一个地址赋值为,如图所示(赋值用黑色标记写在图下方) 进行了 p++操作后的值如图所示(赋值用红色标记写在图中) 所以arr[1]=ox000000a010=2561!=10 3、综上所述:指针++是指的是加一个格子(四个字节)

2、指针运算的总结

指针+数字,地址值需要调整,调整的权重为sizeof(去掉一个*)指针+指针 ,无意义非法指针-指针,合法,间隔的单元个数,可正可负

3、例题

指针加法 int main() { int *p = (int*) 1000; printf("%d\n",p+4);//1016 printf("%d\n",(short*)p+4);//1008 printf("%d\n",(double*)p+4);//1032 printf("%d\n",(long*)p+4);//1016 printf("%d\n",(char**)p+4);//1016 printf("%d\n",(char*)p+4);//1004 printf("%d\n",(longlong)p+4);//1004 } 指针减法 int main() { int *p = (int*)0x2010; printf("%x\n",p-2);//2010-2=2008 printf("%x\n",(char*)p-2);//0x2010-2=200e printf("%x\n",(float*)p-2);//2008 printf("%x\n",(double**)p-2);//2000 printf("%x\n",(unsigned long*)p-2);//2008 printf("%x\n",(char*****)p-2);//2008 printf("%x\n",(unsigned int)p-2);//200e }
转载请注明原文地址: https://www.6miu.com/read-5039451.html

最新回复(0)