C语言指针问题。

大佬请看图。
++(*pointer)为什么会得出3?
*(pointer-2)为什么会得出6?

这是一个运算顺序的问题。注意括号的运用。
(1) ++(*pointer)是先取值,再自增,当前pointer指向的是位置arr[3],取值后是2,*pointer的结果是2,2再自增,当然会得出3。
值得说明的是,这个括号是可以省略的,此处括号只起到增加程序可读性的作用。
(2)*(pointer-2)是先移动指针,再取值。pointer-2是把指针从当前位置arr[3]回退两个位置,指向了arr[1],再取值,也就是取出的元素6。
当然,这个括号是不可省略的。
还有不明白之处,请留言。
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-02-19
*pointer是指针指向的一个值,此时为2,这个值再自加1自然为3。

pointer此时还指向值2,减2的含义是指针回退两个元素,自然指向了值6。

指针本身有值,表示它指向的地址,这个值可以运算,表示对地址的修改。而指针指向的值,其实就是位于这个地址所存的值。

在汇编以上层次的编程中,内存实际上理解为地址和值就够了,比如说指针值为100,就相当于地址100(这实际上是一个基于基址的偏移),而说指针指向200时,实质是说位于地址100的内存存储了200这个值。

再推广到函数的参数,书上所谓的形参,变参什么的除了混淆是非,没用,只要记好何时传地址,或传值,就不会有什么问题。

在内存中是找不到指针这种有形的东西的,如果我们把内存中某个位置存放的一个数值看成指针,那这个值就是某个值所在的地址。到这个地址去找,才能知道某个值的大小。到了下一个程序运行的时候,这个位置存放的值的含义可能又变了。因此,学语法是一个长期的过程,要能理解到为什么这样是合理的,才算真正出师了
第2个回答  2019-02-19

注意*pointer++和*(pointer++),运行结果是一样的,都是先取pointer的地址,再++。

pointer初始指向arr[3],值2。

执行printf("%d\n",*pointer);pointer指向arr[3],先打印pointer指向值2,打印后pointer指向arr[3]。

执行printf("%d\n",*pointer++);pointer指向arr[3],先打印pointer指向值2,打印后pointer++指向arr[4]。

执行printf("%d\n",*(pointer++));pointer指向arr[4],再打印pointer指向值5,打印后pointer++指向arr[5]。

执行printf("%d\n",*--pointer);先执行--,指向arr[4],再打印pointer指向值5,打印后pointer指向arr[4]。

执行printf("%d\n",*(--pointer));先执行--,指向arr[3],再打印pointer指向值2,打印后pointer指向arr[3]。

执行printf("%d\n",++(*pointer));先取指向地址arr[3]的值2,将arr[3]的值++,打印3,打印后pointer指向arr[3]。

执行printf("%d\n",*(pointer-2));先执行-2,指向arr[1],再打印pointer指向值6,打印后pointer指向arr[1]。

执行printf("%d\n",*(arr+3));arr+3就是arr[3],打印3(arr[3]在倒数第三条已自增)

第3个回答  2019-02-19
第一个,pointer下标地址为3内容为2,自加符号在前,是先加完再执行,2+1等于3
第二pointer下标地址为3,3-2等于1,下标地址为1的内容是6。
我自学c语言,这是我的理解。
第4个回答  2020-04-25

30分钟彻底学会C语言指针

C语言中的指针问题到底是怎么回事~
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。 指针所指向的内存区和指针所指向的...

C语言指针问题。
这是一个运算顺序的问题。注意括号的运用。(1) ++(*pointer)是先取值,再自增,当前pointer指向的是位置arr[3],取值后是2,*pointer的结果是2,2再自增,当然会得出3。值得说明的是,这个括号是可以省略的,此处括号只起到增加程序可读性的作用。(2)*(pointer-2)是先移动指针,再取值。p...

c语言指针的赋值问题
在C语言中,指针的赋值是通过将变量的地址赋给指针变量来实现的。指针的基本概念 在C语言中,指针是一个变量,其特殊之处在于它存储的是其他变量的地址,而不是值本身。指针使我们能够间接地访问和修改变量的值。指针的赋值过程 当我们为指针变量赋值时,实际上是将其指向一个变量的内存地址赋给它。这...

C语言指针问题?
调用结束后,所有实际参数的值均不会发生变化。但是swap3中*pa,*pb发生的交换(实际就是主函数中a和b的值发生了交换)

C语言指针问题
一、如有定义char y[4]= "321"则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符...

C语言指针问题
假如 P 是指针 那么 *p 就代表变量。 而&a是地址, *p=&a 就是把地址给变量,当然不正确了,因为地址只能给指针。p2,*p1都是变量,变量之间互相赋值是正确的。“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义...

c语言问题,关于指针的问题
一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行。否则就一直循环,这样我们就能判断p为空了。同理!p,自然就能判断p不为空了。二、p...

C语言指针的赋值问题
int*p;p为指针,地址是未知的,如果直接赋值 p=a;这样编译可以通过,但是会产生警告,p的地址是随机分配的,这样对未知的地址赋值很危险,可能会覆盖掉某些重要数据,所以避免这种危险,在定义指针时注意初始化,也就是赋值。可以int*p=&a;或者int*p;p=&a;然后再对p进行操作 有错。注意大小写,...

C语言求助指针的移动问题
这几个运算符中,=叫赋值运算符,它的优先级最低,而++的优先级最高,*次之。其实运算结果也不是“先赋值”,是先进行*操作从p指向的地址中取出值来才赋给S的,最后才对p增1。之所以优先级最高的++在最后进行,是由它自身的功能决定的:它写在变量后面,叫后增1运算符。后增1运算符要在它...

c语言,指针指向另一个指针的问题,为什么报错?
图中红色框内代码有误,*(p+5)不是表示指针而是值。应改为 q = p+5 另外补充说明,改成这样虽然没有语法错误,但是很明显p+5已经超过数组a的内存空间,需要注意。

相似回答