当前位置:首页 » 编程语言 » c语言指针运算符的

c语言指针运算符的

发布时间: 2023-05-31 15:23:10

A. c语言 指针运算符和指针说明符有什么区别

指针运算符和指针说明符 外形上一样昌哗蠢,都是 * 号, 一个用在 语句里,一个用在声明里。
例如:
int *p; 声明 p 是指针,它可用来指向一个 整形变量。
int (*pf)(); 声明pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。耐陪
int *ap(int x,int y){...} 声明 函数 ap, 有2个形参,函数调用会返回 一个指针,用来指向一个 整形变量。
指针运算符,也在其操作数的左边,该操作数是一地址,用*可取得该地址处存储的变量的值,可做右值,也可做左值。例如:
int myAge;
int *p; //指针说明符
*(&myAge)=24; // 指针运算符,&myAge 是地址,* 是取那个地址里的值的运算,做左值
printf("%d",myAge);
p=&myAge;
printf(" %d",*p+1); //指针运算符, 输出 指针指向的变量的值加1,芦判做右值。
输出 24 25

B. C语言的指针运算符号

*称为指针运算符(单目运算符),也称取内容运算符。是用来表示指针变量和它所指向的变量直接的联系。如果已经定义i_pointer为指针变量,则(*i_pointer)是i_pointer所指向的变量。其实*i_pointer也是一个变量,它和变量i是同一回事。下面两个语句作用相同。 1、i=3; 2、*i_pointer=3; 第二个语句的含义是将3赋给指针变量i_pointer所指向的变量。 取地址运算符&,可以取得变量在内存中的地址。例如: pointer_1=&a; 表示把变量a的地址赋给pointer_1 * (*(a+1)+j)表示1行j列元素a[1][j]的值。 *(a+1)+j表示1行2列元素a[1][j]的地址。 这个没有为什么,就是规定的吧!

C. C语言中指针的用法介绍(2)

如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘 sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。

总结一下,一个指针ptrold加上一个整数 n后,结果是一个新的指针ptrnew,

ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了 n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了 n乘 sizeof(ptrold所指向的类型)个字节。

一个指针ptrold减去一个整数 n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了 n乘 sizeof(ptrold所指向的类型)个字节,就是说, ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

第三章。运算?amp;和*

这里&是取地址运算符,*是...书上叫做"间接运算符"。

&a的运算结果是一个指针,指针的类型是 a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a 的地址。*p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

例五:

int a=12;

int b;

int *p;

int **ptr;

Generated by Foxit PDF Creator ? Foxit Software

http://www.foxitsoftware.com For evaluation only.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 类型的变量。

第四章。指针表达式。

一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。

下面是一些指针表达式的例子:

例六:

int a,b;

int array[10];

int *pa;

pa=&a;//&a是一个指针表达式。

int **ptr=&pa;//&pa也是一个指针表达式。

*ptr=&b;//*ptr和&b都是指针表达式。

pa=array;

pa++;//这也是指针表达式。

例七:

char *arr[20];

char **parr=arr;//如果把arr 看作指针的话,arr 也是指针表达式

char *str;

str=*parr;//*parr 是指针表达式

str=*(parr+1);//*(parr+1)是指针表达式

str=*(parr+2);//*(parr+2)是指针表达式

由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。

在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr 这个指针已经占据了内存,其实*ptr 就是指针 pa,既然 pa 已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。

第五章。数组和指针的关系

Generated by Foxit PDF Creator ? Foxit Software

http://www.foxitsoftware.com For evaluation only.如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文?lt;<如何理解c 和c++的复杂类型声明>>。数组的数组名其实可以看作一个指针。看下例:

例八:

int array[10]={0,1,2,3,4,5,6,7,8,9},value;

...

...

value=array[0];//也可写成:value=*array;

value=array[3];//也可写成:value=*(array+3);

value=array[4];//也可写成:value=*(array+4);

上例中,一般而言数组名array代表数组本身,类型是 int [10],但如果把array看做指针的话,它指向数组的第 0个单元,类型是 int *,所指向的类型是数组单元的类型即 int。因此*array等于 0 就一点也不奇怪了。同理,array+3 是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

例九:

例九:

char *str[3]={

"Hello,this is a sample!",

"Hi,good morning.",

"Hello world"

};

char s[80];

strcpy(s,str[0]);//也可写成strcpy(s,*str);

strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));

strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名 str 当作一个指针的话,它指向数组的第 0号单元,它的类型是char**,它指向的类型是char *。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即’H’的地址。

D. 在c语言的指针运算中*(p+1)与p+1有什么区别 p是指针

*(p+1)表示具体的数值,指针p所指向的内存地址单元的下一个内存地址单元中的值;
p+1
表示地址,指针p所指向的内存地址的下一个内存地址。
可以通过下面的实例来理解*(p+1)与p+1之间的区别:
int *p; // 定义一个int类型的指针p
int a[3]={1,2,3}; // 定义一个int类型的数组a,并进行初始化
p = a; // 使指针p指向数组a的首地址
printf("%d", *(p+1)); // 输出2,等价于a[1]
printf("%x", p+1); // 以16进制形式输出a[1]的地址(如08ff12),等价于&a[1](&为取地址运算符)

E. C语言指针运算符

根据函让尘消数执行的效果,显然你的理解是错的
*b++=0;

相当于*b=0;b=b+1;

这里的++是要等坦知b参与的运算结束之后再加1

注意 ++b 和 b++ 的兄和区别

F. c语言中指针运算符*和自增运算符++的优先级

运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,乘除运算符具有比加减运算符更高的优先级。

例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7。

结合性是指具有相同优先级的操作符的运算顺序,从左至右运算称为左结合,从右至左运算称为右结合。

自增(++)和自减(--)操作符为对象加1或减1操作提供判雀了方便简短的实现方式。它们有前置和后置两种使用形式。到目前为止,我们已经使用过前自增操作,该操作使其操作数加1,操作结果是修改后的值。

C语言运算符是说明特定操作的符号,它是构造C语言表达式的工具。C语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。

(6)c语言指针运算符的扩展阅读

运算符优先掘稿早级

1、函数计算优先。

2、其次是强制类型转换。

3、自增、自减和取反次之。

4、先乘除再加减。

5、有括号先算括号内的。

6、表达式中出现连续两个运算符时最好用空格隔开,如a+++b要写成:a++ +b或a+ ++b。同一优先级的运算符,运算次序由结合敬备方向所决定。

G. C语言中如何用指针运算符来表示一个二维数组的元素及地址

二维指针,就是说第一维是指针,第二维还是指针;
拿*(*(a+i)+j)来说:a是数组的首地址吧,然后+i,就是说a地址向后偏移i位。就是a+i的地址了,注意,这里a+i只是地址,用*符号取出该地址的数据,就是*(a+i),这里*(a+i)就是第一维指针,它指的是地址,不是数据。
而且后面的*(a+i)+j就是说以*(a+i)为首地址,偏移j位,然后使用*取内容,这里就是第二维了,取到的数据就是实际数据了

H. C语言指针变量运算

目前只有和整型的加减貌似可执行,是不是太奇葩了?
一点也不是,因为只需要加减运算
int
*p=(int
*)0xA00000000;
int
*p1=p+10;
int
x;
下面是指针可以进行的运算。
p-x;//指针
p+x;//指针
p--;//指针
p++;//指针
++p;//指针
--p;//指针
!p;
//
整数或bool
p-p1;//整数个数
p+10;//指针
p-10;//指针
指针不需要其他运算!!!!!
难道你是想这样做!
p+=(p-p1)*200;
p-=(p-p1)/200;
p=(int
*)((int)p/20);

I. 关于C语言指针问题~

你首先要明白,指针运算符的作用,我用一言以概之,你在哪里使用都不会错。指针运算符*的作用是求出*后面所指地址里的值。因此只要*后面的变量表示的是一个地址就可以使用*运算符,来求出这个地址中的值,你不用管这个地址的表示形式是怎样的,只要是地址就可以使用*来求出地址中的值。

第二:[ ]这个运算符的的运算法则是,把左侧的地址加上[ ]内的偏移量然后再求指针运算,注意有[ ]运算符的地方就有个隐含的指针,比如x[2]表示的就是将指针x偏移闹迅2个单位量后再求指针运算。也就说x[2]与*(x+2)是相等的。对于二维数组a[3][4],因为数组名是一个地址,他是指向的二维数组第一行所表示的一维数组的地址,因此a与a+0是等价的。同样a[0]与*(a+0)等价,从这里可以看出a[0]仍然表示的是地址,这个地址就是二维数组第1行第1个元素的地址,因此a[0]与a[0]+0是一样的,那么对a[0]+0这个地址再求指针就得到了a[0]+0这个地址的值,也就是*(a[0]+0)就等于a[0][0]也就二维数组第一行第一列元素的值了,要注意a[0]+0与a[0][0]是不相等的,a[0]+0表示的是地址,而a[0][0]表示的是对a[0]的地址偏移0个单位做升然后再求指针运算,也就是表示的是a[0]+0这个位置的值。
在二维数组中a[0]表示的是二维数组第一行第1列元素的地址,但&a[0]就与数组名a是等介的,表示的是二维数组第一行所包含的一维数组的首地址,液胡此也就是二维数组第一行的行地址。同样a+1就与&a[1]是等价的,表示的是二维数组行二行的行地址,而a[1]则表示的是二维数组第二行第一列的元素的地址。

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:335
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:378
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:612
java用什么软件写 发布:2025-05-18 03:56:19 浏览:31
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:942
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:739
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:802
网卡访问 发布:2025-05-18 03:35:04 浏览:510
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:371