1613551 发表于 2022-5-12 10:53:41

指针取值的区别

本帖最后由 1613551 于 2022-5-12 10:55 编辑

请问这个三个指针赋值的区别是什么?


第一个程序的第11行和第二个程序的第8行,也就是,printf("%d\n", *(*p2 + i))和printf("%d\n", *(*(p+1)-6))的区别是什么?

#include <stdio.h>

int main()
{
      int temp = {1, 2, 3, 4, 5};
      int (*p2) = &temp;
      int i;

      for (i = 0; i < 5; i++)
      {
                printf("%d\n", *(*p2 + i));
      }

      return 0;
}


#include <stdio.h>

int main()
{
      int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
      int (*p) = &array;

      printf("%d\n", *(*(p+1)-6));

      return 0;
}

第三个程序的第7行不是数组指针的命名方式吗 为什么多了一个*啊{:10_266:}

#include <stdio.h>


int main()
{
      char *array = {"FishC", "Five", "Star", "Good", "WoW"};
      char *(*p) = &array;
      int i, j;

      for (i = 0; i < 5; i++)
      {
                for (j = 0; *(*(*p + i) + j) != '\0'; j++)
                {
                        printf("%c ", *(*(*p + i) + j));
                }
                printf("\n");
      }

      return 0;
}

1613551 发表于 2022-5-12 20:36:29

大家快来回复啊,有鱼币拿

豆嘉木 发表于 2022-5-12 11:18:43

首先要搞清楚*(解引用)的用法,*是讲指针变量在地址和值之间转换
第一个程序第11行:*p2 + i的意思是temp数组偏移一个位置,也就是temp,即2,然而它得到的是地址,所以在*p2 + i的外面还要加一个(),括号外面的*是取出这个位置的值,即2,并打印
第二个程序第8行跟上面一个道理
第三个程序第七行,这个最好理解,你把(*p)看作一个整体,把它当作a吧,带上外面那个星号,整个第七行就是*a = &array,这个总能理解了吧,指向数组指针的指针,因为数组指针是指针,所以这就是指向指针的指针
打字不易!!兄弟觉得有道理给个最佳答案谢了{:10_335:}

风车呼呼呼 发表于 2022-5-12 11:50:09

本帖最后由 风车呼呼呼 于 2022-5-12 11:53 编辑

1.地址计算的起始点不同
printf("%d\n", *(*p2 + i))
从*p2,即temp的地址开始偏移

printf("%d\n", *(*(p+1)-6))
从*(p+1),即array的位置往回偏移(array不属于array的空间!)

2.char *(*p) = &array;

按运算符优先级
*p                        ——p是指针
(*p)                ——p是指向长度为5的数组的指针
*(*p)                ——这个数组里的元素是指针
char *(*p)        ——这个数组里存放的是指向char的指针

整理:p是指向(长度为5的指针数组(存放着char指针))的指针

xyyzzjw 发表于 2022-5-12 15:42:30

可惜不懂,也要回帖

1613551 发表于 2022-5-12 16:20:32

风车呼呼呼 发表于 2022-5-12 11:50
1.地址计算的起始点不同
printf("%d\n", *(*p2 + i))
从*p2,即temp的地址开始偏移


{:10_277:}我看第3个程序的第14行还是有点蒙,大佬可以讲解一下吗

1613551 发表于 2022-5-12 16:47:41

不知道我自己回帖有没有奖励

1613551 发表于 2022-5-12 16:48:45

看来是没有奖励了,{:10_245:}c语言简直和高数一样难,我还是适合当文科生,指针真是想破脑袋了

风车呼呼呼 发表于 2022-5-12 16:53:58

本帖最后由 风车呼呼呼 于 2022-5-12 16:55 编辑

printf("%c ", *(*(*p + i) + j));

p:                &array
*p:                array
*p+i:        array [ i ]        (指针数组中的第i个元素(指针))

*(*p+i):                该指针所指的地址(字符串首地址)
*(*p+i)+j:        该字符串第j个字符的地址
*(*(*p+i))+j):        该字符串第j个字符

单独看不懂这条语句没关系,也应该知道这是在遍历打印array数组,第 i 串的第 j 字符。由结果反推对应表达式也不会很难

gandixiwang 发表于 2022-5-12 17:00:31

第三个程序你在最后(return 0;)前面加上我这两行代码
      printf("%s\n",*(*p));
      printf("%c\n",*(*(*p)));
输出结果,再理解试试看?

kerln888 发表于 2022-5-12 17:09:16

学习一下!!

gandixiwang 发表于 2022-5-12 17:09:43

我补充更详细一点
      printf("%s\n",*(*p));
      printf("%s\n",*array);
      printf("%s\n",array);
      printf("%c\n",*(*(*p)));
你试试把我这几行代码加进去最后面运行输出结果,再思考,或许会更容易理解一点

gandixiwang 发表于 2022-5-12 17:18:58

gandixiwang 发表于 2022-5-12 17:09
我补充更详细一点

你试试把我这几行代码加进去最后面运行输出结果,再思考,或许会更容易理解一点

我这个结果就是证明了*array等于array等于*(*p)等于你那个程序里的FishC

所以*(*(*p))就等于FishC里的F
如果把*(*(*p))改成*(*(*p)+1),那结果就是FishC里的i
如果把*(*(*p))改成*(*(*p+1)),那结果就是Five里的F

gandixiwang 发表于 2022-5-12 17:20:47

编程这种东西不仅需要动脑,还需要动手,这个我也是自己试验出来的

1molHF 发表于 2022-5-12 17:40:13

学习一下

人造人 发表于 2022-5-12 17:44:43

1613551 发表于 2022-5-12 16:48
看来是没有奖励了,c语言简直和高数一样难,我还是适合当文科生,指针真是想破脑袋了

指针是C语言的重点,也是难点,你打算花几个月就掌握指针?
指针这部分先跳过吧,先学后面的,然后学汇编语言
站在汇编语言的角度看C语言

1613551 发表于 2022-5-12 18:42:12

人造人 发表于 2022-5-12 17:44
指针是C语言的重点,也是难点,你打算花几个月就掌握指针?
指针这部分先跳过吧,先学后面的,然后学汇 ...

其实我是插本,插本甚至都不考指针,去年只出了一道题还是选择题,但是我还是想学好指针吧

1613551 发表于 2022-5-12 18:43:00

风车呼呼呼 发表于 2022-5-12 16:53
printf("%c ", *(*(*p + i) + j));

p:                &array


懂了懂了,大概是懂了

1613551 发表于 2022-5-12 18:46:32

gandixiwang 发表于 2022-5-12 17:18
我这个结果就是证明了*array等于array等于*(*p)等于你那个程序里的FishC

所以*(*(*p))就等于Fish ...

{:10_254:}懂了

tjweiyanmin 发表于 2022-5-12 22:25:27

加油
页: [1] 2
查看完整版本: 指针取值的区别