-1

我有一个关于func1 和主程序第一段的快速问题。本质上,我不理解 a.word-- (in func1) 。

我已将其注释掉,并且 a.word 的输出中没有任何变化,但我不明白为什么它无关紧要。

是否将所有值向下移动 1?或者它只是从最后一个字母循环到倒数第二个字母,如果是这样,为什么在打印 a.word 时会打印出整个“myword”?

我是指针和整件事的新手。

谢谢!

#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指向前一个元素,而不是它指向的当前元素。这是基本的指针算术,但是由于您说您是指针新手,因此我“指出”了它。

它与减量运算符的不同之处在于,它不只是减去 1,aword而是使它指向前一个元素,该元素可能距当前元素 N 个字节。你使用过吗

a.word++;

现在它将是下一个元素的地址/指针。在您的程序中,a.word用于存储字符串的基地址。a.word++因此将指向字符串的“下一个字符”。

于 2013-04-22T05:41:03.620 回答