鱼C论坛

 找回密码
 立即注册
查看: 2131|回复: 14

[已解决]指针s + i指向的问题

[复制链接]
发表于 2017-12-19 12:09:38 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
void print_array (int *const s,int n);
int main()
{
        int array [5] = {4,5,2,3,0};
        print_array (array,5);
        return 0;
}
void print_array (int * const s,int n)
{
        int i;
        for (i = 0;i < n;i++)
                printf ("%d %d\n",*(s + i),s + i);//s + i这个时候s这个指针指向的是s[0],还是s的位置
}

s[0]S[1] S[2] S[3] S[4]

当执行 s+i的时候 ,s指向的一直是s【0】,还是指向s【i】?请各位大神指教、谢谢了!!!
最佳答案
2017-12-19 12:37:00
s 是指向 s[0]
s + i 是指向 s[i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-19 12:15:10 From FishC Mobile | 显示全部楼层
一直是s[0]
s指针是const的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 12:37:00 | 显示全部楼层    本楼为最佳答案   
s 是指向 s[0]
s + i 是指向 s[i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2017-12-19 13:13:23 From FishC Mobile | 显示全部楼层
sp1ral 发表于 2017-12-19 12:15
一直是s[0]
s指针是const的

那如果不加const 是否也是一直指向s【0】?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-19 13:15:07 From FishC Mobile | 显示全部楼层
BngThea 发表于 2017-12-19 12:37
s 是指向 s[0]
s + i 是指向 s

但是,如果你函数fun中加入printf(%s,s),他输出的是s【0】的地址呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 13:21:02 | 显示全部楼层
fdsf 发表于 2017-12-19 13:15
但是,如果你函数fun中加入printf(%s,s),他输出的是s【0】的地址呀

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

使用道具 举报

 楼主| 发表于 2017-12-19 13:23:44 From FishC Mobile | 显示全部楼层
BngThea 发表于 2017-12-19 13:21
所以呢?

所以我想的是,s+i还是指向的s【0】,而且我还特地加了一个const,一直这个地方想不明白。我看书中介绍都是指向s【i】。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 13:47:03 | 显示全部楼层
fdsf 发表于 2017-12-19 13:23
所以我想的是,s+i还是指向的s【0】,而且我还特地加了一个const,一直这个地方想不明白。我看书中介绍都 ...

s 本身一直指向 s[0]
s + i 指向第 i 个元素 s[i]
这跟你在fun函数中加入
printf("%p",s) 打印 s[0] 的地址有什么冲突?
你在函数中加入
printf("%p",s+i) 打印的就是 s[i] 的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-19 13:55:50 From FishC Mobile | 显示全部楼层
BngThea 发表于 2017-12-19 13:47
s 本身一直指向 s[0]
s + i 指向第 i 个元素 s
这跟你在fun函数中加入

我比较笨,在问一下:当s+1指向s【1】的时候,我这时候打印printf(s),我想的是应该输出的是s【1】的地址啊?还请大神赐教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 14:20:20 | 显示全部楼层
fdsf 发表于 2017-12-19 13:55
我比较笨,在问一下:当s+1指向s【1】的时候,我这时候打印printf(s),我想的是应该输出的是s【1】的地 ...

为什么会指向s[1]的地址?
printf(s)当然还是打印s[0]的地址
printf(s+1)才是打印s[1]的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-19 14:33:34 From FishC Mobile | 显示全部楼层
BngThea 发表于 2017-12-19 14:20
为什么会指向s[1]的地址?
printf(s)当然还是打印s[0]的地址
printf(s+1)才是打印s[1]的地址

原来是这样,我想我把一些东西搞混了。
实际上,s一直没有变,一直指向的就是s【0】。
s+1的时候,指针指向s【1】,s的值没有变,s+sizeof(int)。
谢谢您了,我一直没有转过弯来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-20 16:32:56 From FishC Mobile | 显示全部楼层
BngThea 发表于 2017-12-19 14:20
为什么会指向s[1]的地址?
printf(s)当然还是打印s[0]的地址
printf(s+1)才是打印s[1]的地址

大神,关于这个问题,还想在请假您一下,当执行s+i的时候,会不会把s+i的地址赋值给s呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 18:40:36 | 显示全部楼层
本帖最后由 新建word 于 2017-12-20 18:42 编辑

首先  抛开 const 常量 只说  指针的问题

void print_array (int *const s,int n);
这是你函数 原型  
其中变量s因为他是指针 他储存的是内存地址而非数据 。
for (i = 0;i < n;i++)
                printf ("%d %d\n",*(s + i),s + i);
*(s+i)  其中有小括号, 默认计算机会先执行括号中的表达式,计算完内存地址的位置 ,进行取数据,接着由printf格式化成%d数据打印,而后面 你没有取数据运算 所以 打印出 内存中的地址;


*符号代表的是当前地址的数据(默认是二进制哈, 因为计算机只能识别  0和1。)



对了如果 还是不是很懂的话, 建议你 拷贝该段代码 编译下, 之后debug 进行调试, 同时观察 每个变量的内存地址;

指针 也是变量, 不过储存的是 内存的地址罢了。







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

使用道具 举报

 楼主| 发表于 2017-12-20 20:13:07 | 显示全部楼层
新建word 发表于 2017-12-20 18:40
首先  抛开 const 常量 只说  指针的问题

void print_array (int *const s,int n);

单步调试,我是调试过的。
您说的我是仔细的想过。
s[0]s[1] s[2]s[3] s[4]
第一次s 指向的是&s【0】= 0x123;之后执行s+ 1.
s[0]s[1] s[2] s[3] s[4]
                      现在s + 1 指向&s【1】 = 0x127

s的值一直没有变。一直是0x123.是这个意思吧。此处的s+1 是不是和s++是不一样的?s++输出的s就应该是s【1的值 而不会还是原来的s【0】


谢谢您的耐心讲解 ,真的谢谢!


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

使用道具 举报

发表于 2017-12-22 23:15:28 | 显示全部楼层
本帖最后由 新建word 于 2017-12-23 00:06 编辑
fdsf 发表于 2017-12-20 20:13
单步调试,我是调试过的。
您说的我是仔细的想过。
第一次s 指向的是&s【0】= 0x123;之后执行s+ 1.


        char a[10]={'1','2','3','4','5','6','7','8','9'};
        char *b ="123456789";
        printf("a=0x%X\n&a=0x%X\n*a=0x%X\nb=0x%X\n&b=0x%X\n*b=0x%X\n",a,&a,*a,b,&b,*b);


       
        system("pause");


不说了  指针和变量真的 解释不清楚!


反正我理解的 意思  指针 也是变量 只不过储存的是  数据的  内存地址


你看看          &b 取出的 内存地址 上的数据是什么!







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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-1 05:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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