求具体指点 C指针太凌乱总弄不明确 (具体怎么求)
本文目录导航:
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 类型的变量。
在C言语中指数运算怎样用呀
C言语中指针运算要用pow()函数,例如2的4次方要写成这样:
^在C言语中是一个位操作符,作用是按位异或。
留意:pow()函数要蕴含math.h文件
裁减资料:
c言语基本运算符
C言语中用于基本算术运算的运算符有:+,-,*,%,/。这些运算符的用法和你想像到的基本无异:
加法运算符 “+”使得它两侧的值被加到一同。
减法运算符“-”用它前面的数减去前面的数。
乘法由“*”示意。
C言语并没有计算平方的函数,也没有指数运算符。
但你可以应用乘法来计算平方。
符号“%”示意求余。
求余运算的结果是两数相除后的余数。
因此,介入运算的值必定为整数。
符号“/”示意除法。
留意,浮点类型的除法运算获取一个浮点数结果,而整数除法运算获取一个整数结果。
比如5/2的结果是2。
当你对整数和浮点数启动混合运算时,结果是浮点数,比如5/2.0的结果是2.5。
c言语中 “*”运算符的作用是 所谓“指针”就是
用作乘法,为百双目运算符,方式为a*b, 就是计算数学中的度a乘以b。
用作取值运算,为单目运知算符,依据后续操作数(必定为指针)类型,取其指向的值。
道
所谓的指针,实质上就是地址。
指针变量的值,就是地址的值,当取值运算时内就是到对应的内存地址上,依照指针类型进容行取值。
运算所需变量为一个的运算符叫单目运算符,例如【!,~,()】 。
运算所需变量为三个的运算符叫三目运算符:【?:】
裁减资料:
双目运算符
低等运算符 下标运算符【[]】、重量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】
算术运算符
乘法运算符【*】、除法运算符【/】、取余运算符【%】 、加法运算符【+】、减法运算符【-】
相关运算符
等于运算符【==】、不等于运算符【!=】 、相关运算符【< > <= >= 】
逻辑运算符
逻辑与运算符【&&】 、逻辑或运算符【||】