2013-04-22 3 views
-1

У меня есть быстрый вопрос относительно func1 и первого абзаца основной программы. По сути, я не понимаю a.word-- (в 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); 
} 
+0

Если вы новичок в указателях, и если эта программа не ваша, тогда вы могли бы предоставить только соответствующий раздел в своем вопросе, а не всю программу. В любом случае, посмотрите «арифметику указателей» в Интернете. , но это будет практиковать, чтобы понять это хорошо. Многие люди находят указатели трудными в C (изначально). –

+0

Я просматриваю для предстоящего теста и хочу, чтобы все морщины были сглажены.Поскольку я не изменял код, я не хотел заглушать код и непреднамеренно менять обсуждение на нерелевантные недостатки. Благодарю вас за поддержку, хотя, искренне. :) – user2044189

ответ

1
a.word--; 

Поскольку aword является указателем в вашей программе, все, что делает выше утверждение сделать aword точку к предыдущему элементу, вместо текущего он указывает на. Это базовая арифметика указателя, но поскольку вы говорите, что вы новичок в указателях, значит, я «указываю» ее.

Это отличается от оператора декремента в том, что он не только subtact 1 из aword, но делает это указывает на предыдущий элемент, который может быть N байтов от текущего element.Had вы использовали

a.word++; 

Теперь он будет адресом/указателем на следующий элемент. В вашей программе a.word используется для хранения базового адреса строк. Таким образом, a.word++ укажет на «следующий символ» строки.

+0

Спасибо за ваш ответ! Да, я немного смущен указателями. Итак, поскольку a.word-- просто возвращает одно значение в массиве, почему a.word печатает «myword» вместо «d» (поскольку оно возвращается из нулевого символа)? – user2044189

+1

Я снова рассмотрю ваш код, если вы не можете понять, что я собираюсь сказать в этом комментарии. Посмотрите, что printf() ожидает базовый адрес строки для спецификатора формата% s. Базовый адрес - это ничего, кроме адрес первого элемента строки. Если строка - это имя [10] = «Джон», тогда базовый адрес is & name [0] .In C, это то же самое, что использовать только «имя», а не & name [ 0]. Чтобы напечатать «John» в printf(), вы передаете 'name' в качестве аргумента как printf («% s », имя), которое аналогично printf («% s%, & name [0]). '% s' для цельной строки, а '% c' - для одного символа. –

+0

@ user2044189 Теперь попробуйте немного настроить код для лучшего понимания. Используйте 'printf («% c », name)' .It будет печатать " J "как' name' является адресом первого элемента строки (который является массивом символов). Но теперь рассмотрим этот 'printf («% c », name ++)'. Он напечатает «o», второй элемент в строке. Аналогично 'printf («% c », name + 2)' будет печатать «h». Это арифметика указателя a t работают на самых простых уровнях. –

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

+1

@ user2044189 Похоже, что английский язык не является первым в мире. В любом случае, что он означает, 'a.word -' будет уменьшать/уменьшать указатель. В арифметике указателя это означает, что если он в настоящее время указывает на элемент в массиве , то после декремента он укажет на элемент перед ним. Если бы это было '++', то оно указывало бы на элемент перед ним. Предположим, что указатель 'char *' 'ptr' указывает на 'H' в string «Him», а затем «ptr ++» будет указывать на «i». Если бы это было «ptr + 2» или «ptr + = 2», это указывало бы на «m». Это так просто. –

+0

спасибо. Именно то, что я искал – user2044189

Смежные вопросы