鱼C论坛

 找回密码
 立即注册
查看: 2586|回复: 21

[已解决]指针取值的区别

[复制链接]
发表于 2022-5-12 10:53:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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[5] = {1, 2, 3, 4, 5};
        int (*p2)[5] = &temp;
        int i;

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

        return 0;
}
#include <stdio.h>

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

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

        return 0;
}

第三个程序的第7行不是数组指针的命名方式吗 为什么多了一个*啊
#include <stdio.h>


int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
        char *(*p)[5] = &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;
}
最佳答案
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 字符。由结果反推对应表达式也不会很难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-12 20:36:29 | 显示全部楼层
大家快来回复啊,有鱼币拿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 11:18:43 | 显示全部楼层

回帖奖励 +5 鱼币

首先要搞清楚*(解引用)的用法,*是讲指针变量在地址和值之间转换
第一个程序第11行:*p2 + i的意思是temp数组偏移一个位置,也就是temp[1],即2,然而它得到的是地址,所以在*p2 + i的外面还要加一个(),括号外面的*是取出这个位置的值,即2,并打印
第二个程序第8行跟上面一个道理
第三个程序第七行,这个最好理解,你把(*p)[5]看作一个整体,把它当作a吧,带上外面那个星号,整个第七行就是*a = &array,这个总能理解了吧,指向数组指针的指针,因为数组指针是指针,所以这就是指向指针的指针
打字不易!!兄弟觉得有道理给个最佳答案谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 11:50:09 | 显示全部楼层

回帖奖励 +5 鱼币

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

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

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

2.char *(*p)[5] = &array;

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

整理:p是指向(长度为5的指针数组(存放着char指针))的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 15:42:30 | 显示全部楼层

回帖奖励 +5 鱼币

可惜不懂,也要回帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 16:20:32 | 显示全部楼层
风车呼呼呼 发表于 2022-5-12 11:50
1.地址计算的起始点不同
printf("%d\n", *(*p2 + i))
从*p2,即temp[0]的地址开始偏移

我看第3个程序的第14行还是有点蒙,大佬可以讲解一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 16:47:41 | 显示全部楼层
不知道我自己回帖有没有奖励
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 16:48:45 | 显示全部楼层
看来是没有奖励了,c语言简直和高数一样难,我还是适合当文科生,指针真是想破脑袋了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 字符。由结果反推对应表达式也不会很难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 17:00:31 | 显示全部楼层

回帖奖励 +5 鱼币

第三个程序你在最后(return 0;)前面加上我这两行代码
        printf("%s\n",*(*p));
        printf("%c\n",*(*(*p)));
输出结果,再理解试试看?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 17:09:16 | 显示全部楼层

回帖奖励 +5 鱼币

学习一下!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 17:09:43 | 显示全部楼层
我补充更详细一点
        printf("%s\n",*(*p));
        printf("%s\n",*array);
        printf("%s\n",array[0]);
        printf("%c\n",*(*(*p)));
你试试把我这几行代码加进去最后面运行输出结果,再思考,或许会更容易理解一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 17:18:58 | 显示全部楼层
gandixiwang 发表于 2022-5-12 17:09
我补充更详细一点

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


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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 17:20:47 | 显示全部楼层
编程这种东西不仅需要动脑,还需要动手,这个我也是自己试验出来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 17:40:13 | 显示全部楼层

回帖奖励 +5 鱼币

学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 17:44:43 | 显示全部楼层

回帖奖励 +5 鱼币

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

指针是C语言的重点,也是难点,你打算花几个月就掌握指针?
指针这部分先跳过吧,先学后面的,然后学汇编语言
站在汇编语言的角度看C语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

其实我是插本,插本甚至都不考指针,去年只出了一道题还是选择题,但是我还是想学好指针吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 18:43:00 | 显示全部楼层
风车呼呼呼 发表于 2022-5-12 16:53
printf("%c ", *(*(*p + i) + j));

p:                &array

懂了懂了,大概是懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 18:46:32 | 显示全部楼层
gandixiwang 发表于 2022-5-12 17:18
我这个结果就是证明了*array等于array[0]等于*(*p)等于你那个程序里的FishC

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

懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 22:25:27 | 显示全部楼层

回帖奖励 +5 鱼币

加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-30 04:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表