2013-04-22 107 views
-1

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

如果你不熟悉指针,如果这个程序不是你自己的,那么你只能在你的问题中提出相关部分,而不是整个程序。反正,在网上查找“指针算术”。很容易,但需要练习才能很好地理解它。许多人在C中发现困难(最初)。 – 2013-04-22 05:46:58

+0

我正在评审即将到来的测试,并希望弄清楚所有的皱纹。就不修改代码而言,我不想将代码弄糟,并且无意中将讨论变为无关的缺陷。尽管如此,衷心感谢你的鼓励。 :) – user2044189 2013-04-22 17:44:53

回答

1
a.word--; 

由于aword是程序中的一个指针,所有上述说法确实是让aword指向前一个元素,而不是它指向当前的一个。这是基本的指针算术,但既然你说你是指针的新手,所以我“指出”了它。

这是从在递减运算符不同,它不只是subtact 1从aword但使其指向这可能是N从用来

a.word++; 
当前element.Had字节离开前一个元素

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

+0

感谢您的回答!是的,我仍然有点困惑。因此,由于a.word--简单地返回数组中的一个值,为什么a.word会打印出“myword”而不是“d”(因为它从空字符开始)? – user2044189 2013-04-22 18:11:11

+1

如果你不明白我要在这个评论中说什么,我会再次检查你的代码。看到printf()需要%s格式说明符的字符串的基地址。字符串的第一个元素的地址。如果字符串是name [10] =“John”,那么基地址是&name [0]。在C中,这与仅使用'name'相同,而不是&name [ 0]。因此,要在printf()中打印“John”,您将'name'作为printf(“%s”,name)的参数传递,它与printf(“%s%,&name [0])相同。 '%s'表示整个字符串,'%c'表示单个字符 – 2013-04-22 18:22:13

+0

@ user2044189现在尝试调整一下代码以便更好地理解。使用'printf(“%c”,name)'。它将打印“ J“作为'name'是该字符串的第一个元素(它是一个字符数组)的地址。但现在考虑这个'printf(”%c“,name ++)'。它将打印”o“,第二个元素类似的'printf(“%c”,name + 2)'会打印“h”。这是指针算术a在最简单的层面上工作。 – 2013-04-22 18:26:52

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

+0

是的,代码是为了在考试中追踪 - 这就是为什么它是如此复杂和混乱(老师称之为“讨厌的痕迹”)。 关于a.word-- ;,如果你能详细说明你的答案的最后一句话,那可能会解开我对此的理解。我很亲密,我能感觉到它。 再次感谢您。 – user2044189 2013-04-22 18:03:53

+1

@ user2044189似乎英语不是MM的第一语言。反正他的意思是'a.word - '会减少/减少指针。在指针算术中,这意味着,如果它当前指向数组中的元素,那么在递减之后它将指向它之前的元素。它已经是'++',那么它将指向它前面的元素。假设'char *'指针'ptr'指向'H'字符串“他”,然后在'ptr ++'之后它会指向'i'。已经是'ptr + 2'或'ptr + = 2',它会指向'm'。就是这么简单。 – 2013-04-22 18:14:33

+0

非常感谢。正是我在找什么 – user2044189 2013-04-22 23:52:51