C 从结构中的数组中减去

C 从结构中的数组中减去,c,string,struct,C,String,Struct,我有一个关于功能1和主程序第一段的快速问题。基本上,我不懂一个词-(在func1中)懂 我已经把它注释掉了,a.word的输出没有任何变化,但我不明白为什么它不相关 是否将所有值向下移动1?或者它只是从最后一个字母循环到第二个字母到最后一个字母,如果是这样,为什么在打印一个单词时,整个“myword”都会打印出来 我对指针之类的东西不熟悉 谢谢 #include <stdio.h> struct foo{ int num; char *word; struct foo *ptr;

我有一个关于功能1和主程序第一段的快速问题。基本上,我不懂一个词-(在func1中)懂

我已经把它注释掉了,a.word的输出没有任何变化,但我不明白为什么它不相关

是否将所有值向下移动1?或者它只是从最后一个字母循环到第二个字母到最后一个字母,如果是这样,为什么在打印一个单词时,整个“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);
}
#包括
结构foo{
int-num;
字符*字;
结构foo*ptr;
};
void func1(结构foo);
void func2(结构foo*);
void func3(结构foo);
int main(){
结构foo a;
a、 num=5;
a、 word=“myword”;
职能1(a);
printf(“1%d%s\n”,a.num,a.word);
a、 num=100;
a、 word=“secondword”;
职能2(a);
printf(“2%d%s\n”,a.num,a.word);
a、 ptr=&a;
a、 num=50;
a、 word=“mylastword”;
职能3(a);
printf(“4%d%s\n”,a.num,a.word);
}
void func1(结构foo a)
{
而(*(a.word)!='\0')
{
putchar(*(一个词));
a、 word++;
}
putchar('\n');
如果(a.num%10!=0)
{a.num*=2;}
a、 字--;
printf(“num是%d\n”,a.num);
}
void func2(结构foo*a)
{
而(*(a->word)!='\0')
{
putchar(*(a->word));
a->word++;
}
putchar('\n');
如果(a->num%10!=0)
{a->num*=2;}
一个->字--;
printf(“num是%d\n”,(*a).num);
}
void func3(结构foo a)
{
如果(a.num>a.ptr->num)
{a.num=500;}
其他的
{a.num=a.ptr->num+1;}
a、 word=“myotherword”;
a、 ptr->word=“yetanotherword”;
printf(“3%d%s\n”,a.num,a.word);
}
由于
aword
是程序中的指针,上述语句所做的只是使
aword
指向上一个元素,而不是它所指向的当前元素。这是基本的指针算法,但既然你说你不熟悉指针,所以我就“指出”它

它与减量运算符的不同之处在于,它不仅仅是
aword
中的子动作1,而是指向前一个元素,该元素可能距离当前元素N字节。是否使用了

a.word++;

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

代码显示按值或按指针调用函数之间的差异

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--
这是您询问的,因为此代码有许多缺陷,并且逻辑不清楚。我可以说,如果你对指针不熟悉,如果这个程序不是你自己的,那么你可以只展示你问题中的相关部分,而不是整个程序。总之,在网上查找“指针算法”。这很简单,但要理解它需要练习。很多人发现C语言中的指针很难(最初)。我正在复习即将到来的测试,希望把所有的皱纹都熨平。至于不修改代码,我不想把代码搞得一团糟,不经意间把讨论变成无关的缺陷。不过,衷心感谢您的鼓励。:)是的,代码是要在考试中跟踪的——这就是为什么代码如此复杂和混乱(老师称之为“讨厌的跟踪”)。大约一个字--;,如果你能详细说明你答案的最后一句话,那可能会解开我对这一点的理解。我离得很近,我能感觉到。再次感谢。@user2044189似乎英语不是MM的第一语言。不管怎样,他的意思是
a.word--
将减少/减少指针。在指针算术中,这意味着,如果它当前指向数组中的元素,然后在减量之后它将指向它前面的元素。如果它是
++
,那么它将指向它前面的元素。假设一个
char*
指针
ptr
指向字符串“Him”中的“H”,那么在
ptr++
之后它将指向“i”。如果它是
ptr+2
ptr+=2
,它会指向“m”。就这么简单。非常感谢。这正是我想要的,谢谢你的回答!是的,我还是有点被指针弄糊涂了。那么,既然a.word--只是返回数组中的一个值,为什么a.word打印出“myword”而不是“d”(因为它是从空字符返回的)?如果您不明白我在这个注释中要说什么,我将再次检查您的代码。请参阅printf()%s格式说明符需要字符串的基址。基址只不过是字符串第一个元素的地址。如果字符串为name[10]=“John”,则基址为&name[0]。在C中,这与仅使用
name
,而不是&name[0]相同。因此,要在printf()中打印“John”,将
name
作为参数传递给printf(“%s”,name),它与printf(“%s%”,&name[0])相同。请注意,“%s”表示整个字符串,而“%c”表示单个字符串character@user2044189现在尝试稍微调整一下代码以更好地理解。使用
printf(“%c”,name)
。它将打印“J”“AS <代码> name <代码>是字符串的第一个元素的地址(这是一个字符数组)。但是现在考虑这个代码> PrtTf(“%c”,name ++)<代码>。它将打印“O”,字符串中的第二个元素。类似地,代码> PrtTf(“%c”,name + 2)< /C>将打印“H”。这是指针算法在最简单的层次上工作。
struct foo {
int num;
char *word;
struct foo *ptr;
};