Heim > Fragen und Antworten > Hauptteil
今天碰到了一个简单的题,可是我却有点不理解,代码是这样的:
#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的地址呢?若是,则为什么不能正确运行?
我感觉这个题目很基础了,可是我却似乎没有学透,请问我下一步要怎么加强对指针的理解呢?
谢谢大家。
PHPz2017-04-17 14:35:07
第一,s不可变;
第二,c语言是值传递,你的inc里的s是s的副本,并不能对s有何影响;
第三,你确信的写法确实输出2,但是你是把s[1]赋值给了s[0].
ringa_lee2017-04-17 14:35:07
稍微改下,你知道 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的指针没学好?
ringa_lee2017-04-17 14:35:07
手机端+C4Droid码字,排版混乱还请见谅。
由此可见,传入指针,可以改变指针所指的对象。
传递到函数里的参数(这里是指针)是一个副本,函数执行完成后该副本就会被销毁,从而使用最初的值。
此外,您可以尝试使用指向指针的指针。