今天碰到了一个简单的题,可是我却有点不理解,代码是这样的:
#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的地址呢?若是,则为什么不能正确运行?
我感觉这个题目很基础了,可是我却似乎没有学透,请问我下一步要怎么加强对指针的理解呢?
谢谢大家。
第一に、s は不変です。
第二に、C 言語は値転送です。inc の s は s に影響を与えません。
第三に、その記述はそうですか?出力 2 ですが、s[1] を s[0] に代入します。
少し変更すると、s は実際にはアドレス (ポインター) であり、最初のバイト &s[0] == s を指していることがわかります。次に、その中の値を変更するには、最終的には
リーリー*P = 2
になります。たとえば、関数間でこの値を変更する場合は、そのアドレスをint * p = &i
のように引用して、*p = 2
と記述する必要があります。 ; ここで*p==i
;*
にポインタ変数を加えたものがこのアドレス (ポインタ) の値を指すことに注意してください。関数間で値を変更するには、通常、値をロックするためのアドレスが必要であり、その後、値を変更できるためです。したがって、次のように変更できます:あなたの間違いは、p = p 1 と直接書いたことです。実際には、新しく定義されたポインタ変数を変更しようとしています。 C を学ばずに C を直接学んだはずですか、それとも C ポインタをよく学んでいませんか?
モバイル版 C4Droid コード。レイアウトがわかりにくいのはご容赦ください。


ポインターを渡すと、ポインターが指すオブジェクトを変更できることがわかります。
関数に渡されるパラメーター (ここではポインター) はコピーであり、関数の実行後、コピーは破棄され、元の値が使用されます。
また、ポインターからポインターへのポインターを使用してみることもできます。