2013-04-22 136 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