指针s + i指向的问题
#include <stdio.h>void print_array (int *const s,int n);
int main()
{
int array = {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,还是s的位置
}
sS S S S
当执行 s+i的时候 ,s指向的一直是s【0】,还是指向s【i】?请各位大神指教、谢谢了!!!
一直是s
s指针是const的 s 是指向 s
s + i 是指向 s sp1ral 发表于 2017-12-19 12:15
一直是s
s指针是const的
那如果不加const 是否也是一直指向s【0】? BngThea 发表于 2017-12-19 12:37
s 是指向 s
s + i 是指向 s
但是,如果你函数fun中加入printf(%s,s),他输出的是s【0】的地址呀 fdsf 发表于 2017-12-19 13:15
但是,如果你函数fun中加入printf(%s,s),他输出的是s【0】的地址呀
所以呢? BngThea 发表于 2017-12-19 13:21
所以呢?
所以我想的是,s+i还是指向的s【0】,而且我还特地加了一个const,一直这个地方想不明白。我看书中介绍都是指向s【i】。 fdsf 发表于 2017-12-19 13:23
所以我想的是,s+i还是指向的s【0】,而且我还特地加了一个const,一直这个地方想不明白。我看书中介绍都 ...
s 本身一直指向 s
s + i 指向第 i 个元素 s
这跟你在fun函数中加入
printf("%p",s) 打印 s 的地址有什么冲突?
你在函数中加入
printf("%p",s+i) 打印的就是 s 的地址 BngThea 发表于 2017-12-19 13:47
s 本身一直指向 s
s + i 指向第 i 个元素 s
这跟你在fun函数中加入
我比较笨,在问一下:当s+1指向s【1】的时候,我这时候打印printf(s),我想的是应该输出的是s【1】的地址啊?还请大神赐教 fdsf 发表于 2017-12-19 13:55
我比较笨,在问一下:当s+1指向s【1】的时候,我这时候打印printf(s),我想的是应该输出的是s【1】的地 ...
为什么会指向s的地址?
printf(s)当然还是打印s的地址
printf(s+1)才是打印s的地址 BngThea 发表于 2017-12-19 14:20
为什么会指向s的地址?
printf(s)当然还是打印s的地址
printf(s+1)才是打印s的地址
原来是这样,我想我把一些东西搞混了。
实际上,s一直没有变,一直指向的就是s【0】。
s+1的时候,指针指向s【1】,s的值没有变,s+sizeof(int)。
谢谢您了,我一直没有转过弯来 BngThea 发表于 2017-12-19 14:20
为什么会指向s的地址?
printf(s)当然还是打印s的地址
printf(s+1)才是打印s的地址
大神,关于这个问题,还想在请假您一下,当执行s+i的时候,会不会把s+i的地址赋值给s呢? 本帖最后由 新建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 进行调试, 同时观察 每个变量的内存地址;
指针 也是变量, 不过储存的是 内存的地址罢了。
新建word 发表于 2017-12-20 18:40
首先抛开 const 常量 只说指针的问题
void print_array (int *const s,int n);
单步调试,我是调试过的。
您说的我是仔细的想过。
ss ss s
第一次s 指向的是&s【0】= 0x123;之后执行s+ 1.
ss s s s
现在s + 1 指向&s【1】 = 0x127
s的值一直没有变。一直是0x123.是这个意思吧。此处的s+1 是不是和s++是不一样的?s++输出的s就应该是s【1的值 而不会还是原来的s【0】
谢谢您的耐心讲解 ,真的谢谢!
本帖最后由 新建word 于 2017-12-23 00:06 编辑
fdsf 发表于 2017-12-20 20:13
单步调试,我是调试过的。
您说的我是仔细的想过。
第一次s 指向的是&s【0】= 0x123;之后执行s+ 1.
char a={'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 取出的 内存地址 上的数据是什么!
页:
[1]