雨天Zz 发表于 2020-9-3 20:44:59

指针

#include <stdio.h>
int main()
{
    int i,a[]={1,2,3,4,5,6,7,8,9};
    int *p=a;
    for (i=0;i<9;i++)
    {
      printf("a[%d] 的值是%d\n",i,*p++);
    }
    return 0;
}
这个程序中*p++是怎么运算的?

风过无痕1989 发表于 2020-9-3 22:16:51

printf("a[%d] 的值是%d\n",i,*p++);这条语句,你可能不好理解,我将它分解成:

printf("a[%d] 的值是%d\n",i,*p);
*p++;

能理解了不?

雨天Zz 发表于 2020-9-3 22:55:26

风过无痕1989 发表于 2020-9-3 22:16
printf("a[%d] 的值是%d\n",i,*p++);这条语句,你可能不好理解,我将它分解成:

printf("a[%d] 的值是 ...

我不理解的是,*p++不应该是根据右结合性先算++再算*的吗?

4goodworld 发表于 2020-9-3 23:13:19

本帖最后由 4goodworld 于 2020-9-3 23:22 编辑

我翻看了一些资料,和查看了反汇编代码

情况是设置了一个变量a,先执行   a=*p,然后p++,返回a的值
就算你是 *(p++)
你看看编译器运算的规则

和上图一样
理论的东西我不是很强,无法解释得清楚,我建议你去csdn上去搜搜看
我只能说,编译器的规则在同时出现* ++的时候,就是先解引用,再++

风过无痕1989 发表于 2020-9-4 00:32:47

雨天Zz 发表于 2020-9-3 22:55
我不理解的是,*p++不应该是根据右结合性先算++再算*的吗?

*p = *p + 1 及 *p += 1 与 *p++ 是等价的,*p 它就是一个变量,i++、j++ 能理解吗?

风过无痕1989 发表于 2020-9-4 15:31:01

雨天Zz 发表于 2020-9-3 22:55
我不理解的是,*p++不应该是根据右结合性先算++再算*的吗?

      设 p 指向数组 a 的首元素即 p = a:

      p++; 此时 *р;得到的下一个元素a的值。

      *p++;由于 ++ 和 * 同优先级,结合方向为自右而左,因此它等价于 *(p++),先引用 p 的值,实现 *p 的运算,然后再使 p 自增1。如果 p 当前指向 a 数组中第 i 个元素a[ i ],则:*(p--)相当于a[ i-- ],先对 p 进行“*”运算(求 p 所指向的元素的值),再使 p 自减。

      *(p++)与*(++p)作用不相同! 前者是先取 *p 值,然后使 p 加1。后者是先使 p 加1,再取 *p。若 p 初值为a(即&a),若输出*(p++),得到a的值,而输出*(++p),得到a的值。

      ++(*p)表示 p 所指向的元素值加1,--(*p)表示 p 所指向的元素值减1。如果p = a,则++(*p)相当于++a,若a的值为3,则在执行++(*p)(即++a)后a的值为4,注意:是元素a的值加减1,而不是指针p的值加减1。

      *(++p)相当于a[++i ],先使 p 自加,再进行“*"运算。*(--p)相当于a[--i ],先使 p 自减,再进行“*"运算。

      上面是我学习笔记的一小段,希望能对你有所帮助。

乐乐学编程 发表于 2020-9-21 08:45:26

问题还没解决,帮你顶上去

风过无痕1989 发表于 2020-9-21 22:35:43

乐乐学编程 发表于 2020-9-21 08:45
问题还没解决,帮你顶上去

算了,没有用的,半个月了,只能是下次看到他的帖子,不回复就是了

baige 发表于 2020-9-22 06:35:31

*p++, 先使用*p的值,再p++

baige 发表于 2020-9-22 06:36:59

风过无痕1989 发表于 2020-9-21 22:35
算了,没有用的,半个月了,只能是下次看到他的帖子,不回复就是了

看了下你上面的回复,这就是入门指针了?
*p++ 和 *p += 1或 *p = *p + 1居然等价,推荐自己写个程序去看看吧

wsq999 发表于 2020-9-22 10:05:15

雨天Zz 发表于 2020-9-3 22:55
我不理解的是,*p++不应该是根据右结合性先算++再算*的吗?

你的理解没错,你可以在你的代码上加一句,这样就可以看到地址和值的关系了。p++每加一下地址是在+4的。

#include <stdio.h>
int main()
{
    int i,a[]={1,2,3,4,5,6,7,8,9};
    int *p=a;
    for (i=0;i<9;i++)
    {
      printf("a[%d] 的值是%d\n",i,*p++);
      printf("地址是是%p\n",p);
    }
    return 0;
}

风过无痕1989 发表于 2020-9-22 13:28:42

baige 发表于 2020-9-22 06:36
看了下你上面的回复,这就是入门指针了?
*p++ 和 *p += 1或 *p = *p + 1居然等价,推荐自己写个程序去 ...

我不知道怎么说了,抄一段书给你看:

例如:
int main()
{
int*p,a={1,3,5,7,9};
p=a;
printf("%d",*p++)

有的人认为 “*p++” 的作用是先使 p 加 1,即指向第1个元素 a 处,然后输出第 1 个元素 a 的值 3,其实不然,由于 ++ 的优先级高于 *,因此先执行 p++,而 p++ 的作用是先用 p 的原值进行运算(进行 *p 的运算),然后再使 p 加 1.p 原来指向数组 a 的第 0 个元素 a,因此 *p 就是第 0 个元素 a 的值 1,结论是先输出 a 的值,然后再使 p 加 1。如果是 *(++p),则先使p指向 a,然后输出 a 的值。

晓觉懿 发表于 2020-9-22 16:10:48

雨天Zz 发表于 2020-9-3 22:55
我不理解的是,*p++不应该是根据右结合性先算++再算*的吗?

指针先移动到下一个指针,然后再解引用

405794672 发表于 2020-9-22 20:05:46

++--运算符很特殊。小甲鱼可能没讲,++--在前,则先运算,再赋值。若++--在后,则先赋值再运算。
比如a=8++,b=++8。那么a的值是8,b的值是9。额,我举个例子,简单的形象,能不能这么写代码我可不知道。

还是写完整点吧。比如。i=j=8.而后,a=i++;b=++j。那么,a的值是8,b的值是9。

乐乐学编程 发表于 2020-9-23 22:04:47

baige 发表于 2020-9-22 06:35
*p++, 先使用*p的值,再p++

我的老师也是告诉我们 “ ++ 的优先级高于 * ”,能否说详细一点?谢谢 !

baige 发表于 2020-9-23 23:05:05

本帖最后由 baige 于 2020-9-23 23:07 编辑

乐乐学编程 发表于 2020-9-23 22:04
我的老师也是告诉我们 “ ++ 的优先级高于 * ”,能否说详细一点?谢谢 !

#include <stdio.h>

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

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

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

int main(){
        int a[] = {1,2,3,4};
        int *p = a;
        for(int i = 0; i < 4; ++i){
                printf("%d\n",*p = *p + 1);
               
        }
        return 0;
}
自己看程序运行结果

乐乐学编程 发表于 2020-9-23 23:27:49

本帖最后由 乐乐学编程 于 2020-9-24 14:24 编辑

baige 发表于 2020-9-23 23:05
自己看程序运行结果

第1个程序,输出的结果是:1、2、3、4,第2个程序,输出的结果是:1、1、1、1,第3个程序,输出:2、3、4、5,第4个输出:2、2、2、2

昨天喝多了,没有运行程序,瞎说了,抱歉,抱歉!

gy1768532 发表于 2020-9-24 08:34:20

本帖最后由 gy1768532 于 2020-9-24 08:45 编辑

风过无痕1989 发表于 2020-9-4 00:32
*p = *p + 1 及 *p += 1 与 *p++ 是等价的,*p 它就是一个变量,i++、j++ 能理解吗?

*p = *p + 1和*p+=1是等价的,不过其代表的意思是先*p,取值,然后取出来的值+1,而*p++和*(p++)是等价的,指向下一个元素地址,这个和普通变量有所不同,除此之外,还要注意(*p)++,这里代表的是取出来的值自增,而不是地址了

gy1768532 发表于 2020-9-24 08:45:19

我一开始也遇到这个问题,后来自己琢磨了一下,虽然说优先级不一样,但是理解应该差不多的,就像j = i++,是先把i的值赋值给j,然后在自增1(等价于{j = i;i = i+1;),这里*p++和*(p++)等价,p++是先把p拿出来,然后对p进行运算之后,再自增1,所以*p++就是,先运算p++(这里则是先把p拿出来),发现前面有取值运算,所以对p进行取值运算之后,在执行p+1(也就是指向下一个元素地址)

乐乐学编程 发表于 2020-9-24 14:28:01

baige 发表于 2020-9-23 23:05
自己看程序运行结果

昨晚喝多了,眼花,将*P+=1,看成了*p+=i;将*p+1,看成了*p+i 了,抱歉,抱歉! 我已经修改上面的回复了
页: [1] 2
查看完整版本: 指针