我有一个关于 func1和主程序第一段的快速问题。基本上,我不明白a.word--(在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);
}
答案 0 :(得分:2)
代码显示调用函数by-value或by-pointer之间的差异。
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
。
答案 1 :(得分:1)
a.word--;
由于aword
是程序中的指针,因此上述语句所做的全部是使aword
指向前一个元素,而不是指向它的当前元素。这是基本的指针算法,但是因为你说你是指针的新手,所以我“指出”了它。
它与递减运算符的不同之处在于,它不仅仅是aword
中的1,而是指向前一个元素,该元素可能与当前元素相距N个字节。你使用了
a.word++;
它现在是/指向下一个元素的地址。在你的程序中,a.word
用于存储strings的基址。所以a.word++
将指向“下一个字符”字符串。