c++ - 关于c语言指针的一个简单问题
黄舟
黄舟 2017-04-17 14:33:07
0
3
403

今天碰到了一个简单的题,可是我却有点不理解,代码是这样的:

#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的地址呢?若是,则为什么不能正确运行?
我感觉这个题目很基础了,可是我却似乎没有学透,请问我下一步要怎么加强对指针的理解呢?
谢谢大家。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(3)
PHPzhong

第一に、s は不変です。
第二に、C 言語は値転送です。inc の s は s に影響を与えません。
第三に、その記述はそうですか?出力 2 ですが、s[1] を s[0] に代入します。

いいねを押す +0
左手右手慢动作

少し変更すると、s は実際にはアドレス (ポインター) であり、最初のバイト &s[0] == s を指していることがわかります。次に、その中の値を変更するには、最終的には *P = 2 になります。たとえば、関数間でこの値を変更する場合は、そのアドレスを int * p = &i のように引用して、*p = 2 と記述する必要があります。 ; ここで *p==i ; * にポインタ変数を加えたものがこのアドレス (ポインタ) の値を指すことに注意してください。関数間で値を変更するには、通常、値をロックするためのアドレスが必要であり、その後、値を変更できるためです。したがって、次のように変更できます:

リーリー

あなたの間違いは、p = p 1 と直接書いたことです。実際には、新しく定義されたポインタ変数を変更しようとしています。 C を学ばずに C を直接学んだはずですか、それとも C ポインタをよく学んでいませんか?

いいねを押す +0
左手右手慢动作

モバイル版 C4Droid コード。レイアウトがわかりにくいのはご容赦ください。


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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート