2015-09-14 2 views
0

У меня есть несколько месяцев, что я начал программировать на C, но теперь я окажусь с сомнением, например, пусть увидеть следующий пример кода:Struct точки в качестве параметра функции С

typedef struct 
    { 
     char *var1; 
    }myFooStruct; 

    myFooStruct struct1 [ 200 ]; 

мои сомнения это то, что я получу для ** struct1, & struct1, * struct1, struct1, , когда я передал struct функции, которая принимает указатель двумерного изображения (** myFooStruct), у меня есть базовые знания о указателях 1-but Я нахожусь в замешательстве с указателями на структуры и 2 - как я могу изменить структуру, если я передал ее как параметр в функцию

Если есть еще один подобный вопрос, напишите здесь, пожалуйста, я не мог найти ничего похожего, если вы знаете, что какая-то лекция, которую я читал, тоже приветствуется, большое спасибо!

+0

Обычно вы не можете юридически разыменовывать структуру. Если у вас есть 'myFooStruct struct0;', ​​то '* struct0' является синтаксической ошибкой. Таким образом, поэтому в вашем коде '** struct1' также является синтаксической ошибкой. –

+0

Спасибо, Крис! .... О, ребята, мне было трудно выбрать ответ, я выбираю тот, который я нахожу более полным, чтобы задать вопрос в моей точке посмотрите, спасибо всем за ваши ответы! – Javi9207

ответ

2

* - разыменованный оператор - подумайте об этом как о значении, содержащемся в местоположении xyz.

& - справочный оператор - подумайте об этом как о «месте в памяти переменной xyz».

Соответственно:

myFooStruct struct1 является физическая структура - это реальный объект.

&struct1 равнозначно местоположению в памяти struct1 - это, как правило, адрес (например, 0xf0004782). Обычно вы увидите, что это используется, когда , проходящий по ссылке (см. Википедию для получения дополнительной информации) или при назначении указателю (который буквально указывает на местоположение в памяти - получите его?).

*struct1разыменовываетstruct1 - то есть, она возвращает значение, содержащееся в месте struct1. В приведенном примере это недопустимо, так как struct1 не является указателем на местоположение в памяти.

**struct1 сложно: оно возвращает значение, содержащееся в местоположении, которое содержится в struct1. Другими словами: struct1 указывает на определенное место в памяти. В этом месте находится адрес другого места в памяти! Подумайте об этом как о охоте за мусорщиками - вы идете в место, находите ключ и следуете за ним в другое место.


Как получить доступ к структурам: подумайте о структуре как о коробке. Когда у вас есть коробка перед вами, вам просто нужно открыть ее и посмотреть, что внутри. В C, мы делаем это с помощью . оператора:

char *my_var = struct1.var1

Когда вы не имеете коробку перед вами - то есть, у вас есть указатель на структуру - вы должны получить доступ к местоположению коробка находится, прежде чем вы сможете посмотреть, что внутри. В C у нас есть ярлык для этого: оператор ->:

myFooStruct *pointer_to_struct1 = &struct1 
char *my_var = pointer_to_struct1->var1 
//NOTE: the previous line is equivalent to: 
// char *my_var = (*pointer_to_struct1).var1 
+0

Спасибо вам большое! полный и чистый ответ! – Javi9207

+0

Рад помочь :-) – tonysdg

1

Если вам нужно войти в систему myFooStruct из функции, вы можете указать одиночный указатель: fn(myFooStruct * st). Вы вызываете функцию с помощью fn(struct1) и меняете значения st[N].var1 = .... Двойной указатель может быть необходим, если ваш объект является указателем с выделенной памятью, а не статическим массивом, как ваш.

2

Способ 1 Использование динамического распределения памяти. В основном используется в связанном списке и все ..

Если вы хотите изменить struct в другой функции. сначала объявите указатель на struct.

myFooStruct* struct1; 

Аллот памяти для struct

struct1 = malloc(sizeof(myFooStruct)); 

Отправить адрес функции

func1(struct1); 

Получить его и доступ к нему, чтобы изменить в функции.

void func(myFooStruct* struct1) 
{ 
    (*struct1).member1 = ...; // whatever you wanna do 
    ... 

Way 2

Объявите struct.

myFooStruct struct1; 

Отправить адрес struct функции

func1(&struct1); 

получающего его и доступ к нему, чтобы изменить в функции.

void func(myFooStruct* struct1) 
{ 
    (*struct1).member1 = ...; // whatever you wanna do 
    ... 
+0

Почему вы хотите динамически распределять память для struct? Вам не нужно это делать, чтобы передать структуру другой функции. – DawidPi

+0

Я показал ему один из способов. Я тоже могу добавить другой способ. – Haris

+0

Нет, это нормально. Просто хотел узнать, есть ли какие-то причины для этого :) – DawidPi

1

struct1 просто таблица и быть speciffic это просто указатель на место в памяти.

*struct1 будет вещью, на которую указывает struct1, поэтому она является первой структурой в таблице структур.

Но **struct1 не будет никакой нити. Прежде всего, вы не выделяете память для строки, а вторая строка является членом этой struct not struct. ** struct - это неопределенное поведение, не более того.

&struct - указатель на таблицу, поэтому это указатель на указатель, который указывает первую структуру в таблице.

Вы должны сами решать, что хотите. Если вы хотите передать таблицу ваших структур, то чистый путь будет:

void function(myFooStruct structTab[]); 
1

1. Вы должны пропускать struct pointer работать, чтобы получить доступ struct внутри него.

Объявите STRUCT указатель -

myFooStruct *struct1; 

Выделяют память для struct

и передать его на функцию, которая объявлена ​​как -

type fn(myFooStruct *struct1){ 
    ..... 
    } 

Вызывайте эту функцию, как это -

fn(struct1); 

доступа член структуры, как это - struct->member1

2. Вы можете также передать то, что вы объявили прямо сейчас.

myFooStruct struct1[ 200 ]; 

определяют функцию, -

type fn(myFooStruct struct1[]){ 
..... 
} 

членов структуры доступа, как это - struct[i].member1.

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