鱼C论坛

 找回密码
 立即注册
查看: 1146|回复: 10

[已解决]指针数组,数组指针。

[复制链接]
发表于 2020-5-2 12:16:04 | 显示全部楼层 |阅读模式

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

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

x
#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;
}

指针 p 指向数组 array 的地址,p + 1 便是指向整个数组最后的位置(第二个 array 数组的起始位置),于是 *(p+1) 即下一个数组 array 数组的起始位置,即 &array[11],所以 *(*(p+1)-6) == array[11 - 6] = array[5]。这一段是小甲鱼说的话。

我的问题;
问题一:第二个array数组的起始位置是什么,是再一次循环回来了吗,还是有一次起了一个数组,那这个第二个数组怎么出来的呢?

问题二:*(p+1)是取值啊,是应该第二个数组的第一个元素的的值啊,怎么就等于了11?

问题三:
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));
}
如果按照这个想法去想这个代码的话,那就不能打印出来1,2,3,4,5 了啊,因为*(p2+i)当i=1是就到了第二个数组了。求解,谢谢。
最佳答案
2020-5-2 20:26:10
简单的
*号前面有数据类型 后面的就是指针
例:int* a;double* b;
*号的前面有数据类型,a和b就是指针变量,没有初始化的指针变量;
int intNum=51;//定义一个整型变量
a=&intNum;//指针变量a 保存整型变量intNum的地址 就是a这个指针指向了intNum;
*a=666;//这里的*a 就是对intNum的赋值;

int a = 123;
int *pa = &a和pa = &a又有什么区别呢<<--int8pa=&a定义的时候初始化,相当于int a=123;这个 pa=&a;就是int a;然后a=123;这样
*pa 表示指针变量还是pa表示指针呢,<<-(两个都是指针变量,前者就是定义出来,后者已经定义好了);
pa = &a是把a的地址赋给指针变量,<<--对的;   蒙了呀,求解,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-2 12:25:54 | 显示全部楼层

回帖奖励 +2 鱼币

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

使用道具 举报

发表于 2020-5-2 12:44:28 | 显示全部楼层
本帖最后由 jkluoling1992 于 2020-5-2 13:14 编辑

*(p+1) 应该是&array[10],index 为10 , -6  最后得到的是  arra[4], 这里描述的是index,
11指的是数组空间中连续排列的内存中第11个int类型的数,没定义就是一个非法值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-5-2 13:10:39 | 显示全部楼层
回帖能领鱼币?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 14:23:11 | 显示全部楼层

不知道是回的好能领,还是有概率性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 14:33:43 | 显示全部楼层
怎么讲吧
你这个是一维数组,p+1这个指针就不指向这个数组了,指针直接跨过这个数组
解一:
定义二个维数组;{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ;假如9元素的地址是1004;那么int占4个字节,
下一个数组的首地址就是1008;
解二:
因为int (*p)[10]这是一个指向(数组的地址),不是指向数组第一个元素的地址;*(p+1)得到的是array数组里最后一个元素(9)地址+sizeof(int)
字节的地址;
解三:
对,因为这个指针已经不指向这个数组了,一大步直接偏移20个字节了
建议优化代码
        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);
                }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 15:59:50 | 显示全部楼层
可以看看这个帖子,是我以前回答的。里面还有个链接也是我回答的。应该能帮你解惑
这两个帖子中都有几个回答,不在一个楼层。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-2 18:00:36 | 显示全部楼层
sunrise085 发表于 2020-5-2 15:59
可以看看这个帖子,是我以前回答的。里面还有个链接也是我回答的。应该能帮你解惑
这两个帖子中都有几个回 ...

我在您回复的贴子上回复您了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-2 19:10:39 | 显示全部楼层
徘徊浅行 发表于 2020-5-2 14:33
怎么讲吧
你这个是一维数组,p+1这个指针就不指向这个数组了,指针直接跨过这个数组
解一:

请问这个*号,什么时候是表示指针变量的标识符,什么时候是取值啊。
之前有一个程序是这样的
char a = ‘f’;
char *pa = &a;这条语句和pa = &a有什么区别呢

int a = 123;
int *pa = &a和pa = &a又有什么区别呢
*pa 表示指针变量还是pa表示指针呢,pa = &a是把a的地址赋给指针变量,蒙了呀,求解,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 20:26:10 | 显示全部楼层    本楼为最佳答案   
简单的
*号前面有数据类型 后面的就是指针
例:int* a;double* b;
*号的前面有数据类型,a和b就是指针变量,没有初始化的指针变量;
int intNum=51;//定义一个整型变量
a=&intNum;//指针变量a 保存整型变量intNum的地址 就是a这个指针指向了intNum;
*a=666;//这里的*a 就是对intNum的赋值;

int a = 123;
int *pa = &a和pa = &a又有什么区别呢<<--int8pa=&a定义的时候初始化,相当于int a=123;这个 pa=&a;就是int a;然后a=123;这样
*pa 表示指针变量还是pa表示指针呢,<<-(两个都是指针变量,前者就是定义出来,后者已经定义好了);
pa = &a是把a的地址赋给指针变量,<<--对的;   蒙了呀,求解,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 20:27:23 From FishC Mobile | 显示全部楼层
Juniorboy 发表于 2020-5-2 19:10
请问这个*号,什么时候是表示指针变量的标识符,什么时候是取值啊。
之前有一个程序是这样的
char a =  ...

类类型 * 变量名,这个是定义指针变量,
单独对一个变量名前加*就是取指针指向的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-14 00:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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