C вопрос по указателю (основные и функциональные параметры) - PullRequest
0 голосов
/ 15 марта 2020

Я действительно борюсь с указателями в C. В частности, у меня были проблемы с пониманием того, как работать с указателями, когда они находятся в main, и когда я вводил указатель в параметр функции из main.

У меня есть несколько вопросов о сценарии, на которые, надеюсь, кто-то может ответить :

int main (int argc, char* argv[]) {

    int x = 7;
    int* num = 4;
    char* word = "johnny";

    //Q1. how do I get the address of 'num'? 
    //Q2. how do I get the address of 'x'? (should I be using x's or num's address?)
    //Q2. how do I get the value of 'num'?

    //Q3. how do I get the address of 'word'?
    //Q4. how do I get the whole string for 'word'?
    //Q5. how do I get an individual character in 'word'? (for index 0 ('j') and index 3 ('n'))

}


bool some_func (int* count, char** name) {

    //Q6. how do I get the address of the inputted 'count'?
    //Q7. how do I get the value of the inputted 'count'?

    //Q8. how do I get the address of the inputted string 'name'?
    //Q9. how do I get the whole string of the inputted string 'name'?
    //Q10. how do I get an individual character of the inputted string 'name'? (for index 0 ('j') and index 3 ('n'))

}

Для моих недавних домашних заданий мне давали пугающие заголовки, подобные этим, и я не знаю, как получить из них нужные мне значения. Скажем, я узнал, что, сказав '* name', я получил всю строку, откуда я go оттуда?

Если бы кто-то мог ответить на все вопросы в коде, я думаю, что это, вероятно, будет лучшим способ узнать это, так как это через пример. Спасибо!

1 Ответ

1 голос
/ 15 марта 2020

Во-первых, когда вы объявляете int* num, вы создали указатель. Вы не можете присвоить значение непосредственно указателю. Что вы можете сделать, это объявить переменную, как вы это сделали для int x, и указать указатель на переменную x (отсюда указатель имени) с помощью num = &x (& x относится к адресу x и присваивается num ) Чтобы получить значение num, вам нужно будет использовать *num. Ниже приведен пример:

int *num;
int a = 4;
num = &a;
printf("address of a is %p, and value of a is %d", num, *num);

Вывод в первый пример:

address of a is <0xsome address> , and value of a is 4

Что касается символов, то же самое нельзя назначить значению указателю напрямую (как вы это делали в char* word = "johnny";. Концепция, которую, я думаю, вам следует знать, заключается в том, что "johnny" - это строка, а строки - это, по сути, массив символов, поэтому каждый символ строки имеет свой собственный адрес. Использование аналогично предыдущему примеру:

char* word;
char someString[6] = "johnny";
word = &someString[0];
printf("address of first char of someString is %p, 1st char of someString is %c, 2nd char of someString is %c", word, *(word), *(word+1));

Выходные данные для второго примера:

адрес первого символа someString равен <0xsome address>, 1-й символ someString равен j, 2-й символ someString равен o

Импорт объекта в обратите внимание, что при доступе к каждому символу строки с использованием разыменования указателей, +n должен быть внутри скобки с указателем word.

*word+1 //WRONG

*(word+1) //CORRECT

Надеюсь, это даст вам базовую основу того, что вам нужно для решения остальных вопросов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...