-1

func1 と main プログラムの最初の段落について簡単な質問があります。基本的に、私は a.word を理解していません-- (func1 で) 理解しています。

私はそれをコメントアウトし、a.word の出力には何も変更しませんでしたが、なぜそれが無関係なのかわかりません。

すべての値を1に下げていますか? それとも、最後の文字から最後から 2 番目の文字に循環するだけなのでしょうか。

私はポインターとそのすべてに不慣れです。

ありがとう!

#include <stdio.h>

struct foo{
int num;
char *word;
struct foo *ptr;
};
void func1(struct foo);
void func2(struct foo*);
void func3(struct foo);

int main() {
struct foo a;
a.num = 5;
a.word = "myword";
func1(a);
printf("1 %d %s\n", a.num, a.word);

a.num = 100;
a.word = "secondword";
func2(&a);
printf("2 %d %s\n", a.num, a.word);

a.ptr = &a;
a.num = 50;
a.word = "mylastword";
func3(a);
printf("4 %d %s\n", a.num, a.word);
}

void func1(struct foo a)
{
while(*(a.word) != '\0')
{
    putchar(*(a.word));
    a.word++;
}
putchar('\n');
if(a.num % 10 != 0)
{ a.num *= 2; }
a.word--;
printf("num is %d\n", a.num);
}

void func2(struct foo *a)
{
while(*(a->word) != '\0')
{
    putchar(*(a->word));
    a->word++;
}
putchar('\n');
if(a->num % 10 != 0)
{ a->num *= 2; }
a->word--;
printf("num is %d\n", (*a).num);
}

 void func3(struct foo a)
 {
if(a.num > a.ptr->num)
{ a.num = 500; }
else
{ a.num = a.ptr->num + 1; }

a.word = "myotherword";
a.ptr->word = "yetanotherword";
printf("3  %d %s\n", a.num, a.word);
}
4

2 に答える 2

2

このコードは、値による関数呼び出しとポインターによる関数呼び出しの違いを示しています。

void func1(struct foo a)  // call by value

この場合、すべての変更はa呼び出し元の入力変数には適用されません。

void func2(struct foo *a) // call by pointer

と同じfunc1ですが、この場合、すべての変更が呼び出し側にa影響します。a

 

struct foo {
int num;
char *word;
struct foo *ptr;
};

この構造は一方向リンク リストであり、各要素は次の要素を指します。

 

a.word--;このコードには多くの欠陥があり、ロジックが不明確であるため、あなたが尋ねたことについて。どこかを指しているポインタがメモリとして減少すると言えますchar

于 2013-04-22T05:57:51.520 に答える
1
a.word--;

awordはプログラム内のポインターであるため、上記のステートメントが行うことは、awordそれが指している現在の要素ではなく、前の要素を指すようにすることだけです。これは基本的なポインター演算ですが、あなたはポインターに慣れていないと言うので、私はそれを「指摘」しています。

aword1 を減算するだけでなく、現在の要素から N バイト離れた前の要素を指すようにするという点で、デクリメント演算子とは異なります。

a.word++;

これは、次の要素への/ポインターのアドレスになります。プログラムでa.wordは、文字列のベースアドレスを格納するために使用されます。したがってa.word++、文字列の「次の文字」を指します。

于 2013-04-22T05:41:03.620 に答える