从结构中的数组中减去

时间:2013-04-22 05:35:40

标签: c string struct

我有一个关于 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);
}

2 个答案:

答案 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++将指向“下一个字符”字符串。