问题描述
今天碰到了一个简单的题,可是我却有点不理解,代码是这样的:
#include<iostream>void inc(char *p){ p = p + 1;}int main(){ char s[] = { ’1’, ’2’, ’3’ }; inc(s); std::cout << *s << std::endl; return 0;}
需要你判断输出的是什么。我很确定若想输出‘2’,则inc函数内的代码应该是:
*p=*(p+1);
但是为什么源代码就不能正确run了呢?s本身就是指向数组的第一个元素的指针,我的inc中取的是不是p的地址呢?若是,则为什么不能正确运行?我感觉这个题目很基础了,可是我却似乎没有学透,请问我下一步要怎么加强对指针的理解呢?谢谢大家。
问题解答
回答1:第一,s不可变;第二,c语言是值传递,你的inc里的s是s的副本,并不能对s有何影响;第三,你确信的写法确实输出2,但是你是把s[1]赋值给了s[0].
回答2:稍微改下,你知道 s实际就是个地址(指针),而且指向的是第一个字节,&s[0] == s。那么要改变其里面的值,最终就应该是 *P = 2;比如 int i =1;在跨函数改变这个值得时候 就要引用其地址 比如 int * p = &i ,并且这样写 *p = 2;这里 *p==i;注意 *加上指针变量才是指向 这个地址(指针)里面的值。因为跨函数改值通常是由地址来锁定值,进而才能改值。所以可以这样改:
#include<iostream> void inc(char *p) {*p = *p + 1; } int main() {char s[] = { ’1’, ’2’, ’3’ };inc(s);std::cout << *s << std::endl;return 0; }
你错就错在 你直接写 p = p+1;实际是试图改变的你新定义的指针变量。你应该是没有学C 就直接学C++的吧,还是C的指针没学好?
回答3:手机端+C4Droid码字,排版混乱还请见谅。由此可见,传入指针,可以改变指针所指的对象。传递到函数里的参数(这里是指针)是一个副本,函数执行完成后该副本就会被销毁,从而使用最初的值。此外,您可以尝试使用指向指针的指针。