指针取值的区别
本帖最后由 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;
} 大家快来回复啊,有鱼币拿 首先要搞清楚*(解引用)的用法,*是讲指针变量在地址和值之间转换
第一个程序第11行:*p2 + i的意思是temp数组偏移一个位置,也就是temp,即2,然而它得到的是地址,所以在*p2 + i的外面还要加一个(),括号外面的*是取出这个位置的值,即2,并打印
第二个程序第8行跟上面一个道理
第三个程序第七行,这个最好理解,你把(*p)看作一个整体,把它当作a吧,带上外面那个星号,整个第七行就是*a = &array,这个总能理解了吧,指向数组指针的指针,因为数组指针是指针,所以这就是指向指针的指针
打字不易!!兄弟觉得有道理给个最佳答案谢了{:10_335:} 本帖最后由 风车呼呼呼 于 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指针))的指针 可惜不懂,也要回帖 风车呼呼呼 发表于 2022-5-12 11:50
1.地址计算的起始点不同
printf("%d\n", *(*p2 + i))
从*p2,即temp的地址开始偏移
{:10_277:}我看第3个程序的第14行还是有点蒙,大佬可以讲解一下吗 不知道我自己回帖有没有奖励 看来是没有奖励了,{:10_245:}c语言简直和高数一样难,我还是适合当文科生,指针真是想破脑袋了 本帖最后由 风车呼呼呼 于 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 字符。由结果反推对应表达式也不会很难 第三个程序你在最后(return 0;)前面加上我这两行代码
printf("%s\n",*(*p));
printf("%c\n",*(*(*p)));
输出结果,再理解试试看? 学习一下!! 我补充更详细一点
printf("%s\n",*(*p));
printf("%s\n",*array);
printf("%s\n",array);
printf("%c\n",*(*(*p)));
你试试把我这几行代码加进去最后面运行输出结果,再思考,或许会更容易理解一点 gandixiwang 发表于 2022-5-12 17:09
我补充更详细一点
你试试把我这几行代码加进去最后面运行输出结果,再思考,或许会更容易理解一点
我这个结果就是证明了*array等于array等于*(*p)等于你那个程序里的FishC
所以*(*(*p))就等于FishC里的F
如果把*(*(*p))改成*(*(*p)+1),那结果就是FishC里的i
如果把*(*(*p))改成*(*(*p+1)),那结果就是Five里的F
编程这种东西不仅需要动脑,还需要动手,这个我也是自己试验出来的 学习一下 1613551 发表于 2022-5-12 16:48
看来是没有奖励了,c语言简直和高数一样难,我还是适合当文科生,指针真是想破脑袋了
指针是C语言的重点,也是难点,你打算花几个月就掌握指针?
指针这部分先跳过吧,先学后面的,然后学汇编语言
站在汇编语言的角度看C语言
人造人 发表于 2022-5-12 17:44
指针是C语言的重点,也是难点,你打算花几个月就掌握指针?
指针这部分先跳过吧,先学后面的,然后学汇 ...
其实我是插本,插本甚至都不考指针,去年只出了一道题还是选择题,但是我还是想学好指针吧 风车呼呼呼 发表于 2022-5-12 16:53
printf("%c ", *(*(*p + i) + j));
p: &array
懂了懂了,大概是懂了 gandixiwang 发表于 2022-5-12 17:18
我这个结果就是证明了*array等于array等于*(*p)等于你那个程序里的FishC
所以*(*(*p))就等于Fish ...
{:10_254:}懂了 加油
页:
[1]
2