指针变量的基本运算有哪些 (指针变量的基类型必须与结构体变量的类型相同)
本文目录导航:
指针变量的基本运算有哪些
指针加、减一个整数和两个指针相减运算及++、–运算

指针变量是一种十分关键的数据类型,在C/C++言语中被宽泛地运行。指针变量中存储的是地址值,也就是一个数字地址,可以启动加减运算,但要留意以下几点:
首先,指针变量可以加减,但只能与整型数据加减。
加减的含意并不是其地址值启动了加减,而是与指针指向的数据类型相关联的。
例如,假设指针变量p的值是0x,那么p=p+2;的值并不是0x,而是0x,由于p指向的是一个整型数据类型,所以p+2示意p在内存中前移两个int的距离。
雷同,指针与整型数据相减也是雷同的情理。
其次,指针之间可以相减,但无法以相加。
两个相反类型的指针变量是可以相减的,示意它们之间相隔多少个元素,但相加没有任何意义。
指针变量的自加和自减实践上是与整数1的加减运算。
最后,指针之间可以比拟大小,但雷同限于相反类型的指针变量。
指针之间的大小比拟的意义,示意在内存中它们指向的位置的高下相关。
总之,指针变量的加减运算、相减运算、自加自减运算和大小比拟都是十分关键的操作,但要留意它们的含意和规范经常使用模式。
c言语指针常识点总结
1.指针的经常使用和实质剖析
(1)初学指针经常使用留意事项
1)指针必定要初始化,否则容易发生野指针(前面会具体说明);
2)指针只保留同类型变量的地址,不同类型指针也不要相互赋值;
3)只要当两个指针指向同一个数组中的元素时,能力启动指针间的运算和比拟操作;
4)指针只能启动减法运算,结果为同一个数组中所指元素的下标差值。
(2)指针的实质剖析
①指针是变量,指针*的意义:
1)在申明时,*号示意所申明的变量为指针。
例如:int n = 1; int* p = &n;
这里,变量p保留着n的地址,即p<—>&n,*p<—>n
2)在经常使用时,*号示意取指针所指向变量的地址值
C指针太凌乱总弄不明确,求具体指点
一、指针的算术运算指针可以加上或减去一个整数。
指针的这种运算的意义和理论的数值的加减运算的意义是不一样的,以单元为单位。
例如:例二:char a[20];int *ptr=(int *)a; //强迫类型转换并不会扭转a 的类型ptr++;在上例中,指针ptr 的类型是int*,它指向的类型是int,它被初始化为指向整型变量a。
接上去的第3 句中,指针ptr 被加了1,编译器是这样解决的:它把指针ptr 的值加上了sizeof(int),在32 位程序中,是被加上了4,由于在32 位程序中,int 占4 个字节。
由于地址是用字节做单位的,故ptr 所指向的地址由原来的变量a 的地址向洼地址方向参与了4 个字节。
由于char 类型的长度是一个字节,所以,原来ptr 是指向数组a 的第0 号元开局的四个字节,此时指向了数组a 中从第4 号单元开局的四个字节。
咱们可以用一个指针和一个循环来遍历一个数组,看例子:例三:int array[20]={0};int *ptr=array;for(i=0;i<20;i++){(*ptr)++;ptr++;}这个例子将整型数组中各个单元的值加1。
由于每次循环都将指针ptr加1 个单元,所以每次循环都能访问数组的下一个单元。
再看例子:例四:char a[20]=”You_are_a_girl”;int *ptr=(int *)a;ptr+=5;在这个例子中,ptr 被加上了5,编译器是这样解决的:将指针ptr 的值加上5 乘sizeof(int),在32 位程序中就是加上了5 乘4=20。
由于地址的单位是字节,故如今的ptr 所指向的地址比起加5 后的ptr 所指向的地址来说,向洼地址方向移动了20 个字节。
在这个例子中,没加5 前的ptr 指向数组a 的第0 号单元开局的四个字节,加5 后,ptr 曾经指向了数组a 的合法范畴之外了。
只管这种状况在运行上会出疑问,但在语法上却是可以的。
这也表现出了指针的灵敏性。
假设上例中,ptr 是被减去5,那么解决环节迥然不同,只不过ptr 的值是被减去5 乘sizeof(int),新的ptr 指向的地址将比原来的ptr 所指向的地址向低地址方向移动了20 个字节。
上方请准许我再举一个例子:(一个误区)例五:#includeint main(){char a[20]=” You_are_a_girl”;char *p=a;char **ptr=&p;//printf(”p=%d\n”,p);//printf(”ptr=%d\n”,ptr);//printf(”*ptr=%d\n”,*ptr);printf(”**ptr=%c\n”,**ptr);ptr++;//printf(”ptr=%d\n”,ptr);//printf(”*ptr=%d\n”,*ptr);printf(”**ptr=%c\n”,**ptr);}误区一、输入答案为Y 和o曲解:ptr 是一个char 的二级指针,当口头ptr++;时,会使指针加一个sizeof(char),所以输入如上结果,这个或许只是少局部人的结果.误区二、输入答案为Y 和a曲解:ptr 指向的是一个char *类型,当口头ptr++;时,会使指针加一个sizeof(char *)(有或许会有人以为这个值为1,那就会获取误区一的答案,这个值应该是4,参考前面内容), 即&p+4; 那启动一次性取值运算不就指向数组中的第五个元素了吗?那输入的结果不就是数组中第五个元素了吗?答案能否认的.正解: ptr 的类型是char **,指向的类型是一个char *类型,该指向的地址就是p的地址(&p),当口头ptr++;时,会使指针加一个sizeof(char*),即&p+4;那*(&p+4)指向哪呢,这个你去问上帝吧,或许他会通知你在哪?所以最后的输入会是一个随机的值,或许是一个合法操作.总结一下:一个指针ptrold 加(减)一个整数n 后,结果是一个新的指针ptrnew,ptrnew 的类型和ptrold 的类型相反,ptrnew 所指向的类型和ptrold所指向的类型也相反。
ptrnew 的值将比ptrold 的值参与(缩小)了n 乘sizeof(ptrold 所指向的类型)个字节。
就是说,ptrnew 所指向的内存区将比ptrold 所指向的内存区向高(低)地址方向移动了n 乘sizeof(ptrold 所指向的类型)个字节。
指针和指针启动加减:两个指针不能启动加法运算,这是合法操作,由于启动加法后,获取的结果指向一个不知所向的中央,而且毫有意义。
两个指针可以启动减法操作,但必定类型相反,普通用在数组方面,不多说了。
二、取地址运算符&和直接运算符*这里&是取地址运算符,*是直接运算符。
&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址。
*p 的运算结果就不拘一格了。
总之*p 的结果是p 所指向的物品,这个物品有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址。
例六:int a=12; int b; int *p; int **ptr;p=&a; //&a 的结果是一个指针,类型是int*,指向的类型是//int,指向的地址是a 的地址。
*p=24; //*p 的结果,在这里它的类型是int,它所占用的地址是//p 所指向的地址,显然,*p 就是变量a。
ptr=&p; //&p 的结果是个指针,该指针的类型是p 的类型加个*,//在这里是int **。
该指针所指向的类型是p 的类型,这//里是int*。
该指针所指向的地址就是指针p 自己的地址。
*ptr=&b; //*ptr 是个指针,&b 的结果也是个指针,且这两个指针//的类型和所指向的类型是一样的,所以用&b 来给*ptr 赋//值就是毫无疑问的了。
**ptr=34; //*ptr 的结果是ptr 所指向的物品,在这里是一个指针,//对这个指针再做一次性*运算,结果是一个int 类型的变量。