2015-04-02 2 views
-3

Я думал, что у меня было рудиментарное понимание их, но, видимо, у меня их нет.Попытка лучше понять указатели

#include <stdio.h> 

void f(int *x, char *name) 
{ 
    *x = 4; 
    *name = "stan"; 
} 

int main() 
{ 
    int y = 10; 
    char name = "bob"; 
    f(&y, &name); 
    printf("%d and %s\n", y, name); 
} 

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

+0

этот код когда-либо работал, прежде чем использовать указатели? 'char name =" bob ";'? – Hogan

+0

Ваше понимание для 'int' верное. Ваше понимание для c-строк очень, очень неправильно. В общем, я рекомендую прочитать несколько руководств по [строкам в c] (http://www.tutorialspoint.com/cprogramming/c_strings.htm). 'char' - просто 8-разрядное целое число со знаком. Строка в C представляет собой массив символов 'chars', обычно представляемых как' char [] 'или' char * ', где последний является указателем на заголовок массива' char'. – aruisdante

+1

строка в c является указателем на char (отсюда char * mystring или char mystring []). Hogan: char - это 8-битное целое число, поэтому есть неявный перевод из char * в char и указатель усечен. Некоторым компиляторам нужны флагов, чтобы предупредить вас об этом – Lectem

ответ

0

Это код, который будет работать.

#include <stdio.h> 

void f(int *x, char **name) 
{ 
    *x = 4; 
    *name = "stan"; 
} 

int main() 
{ 
    int y = 10; 
    char *name = "bob"; 

    f(&y, &name); 
    printf("%d and %s\n", y, name); 
} 
+0

Это действительно работает для меня, я также думаю, что это помогло мне понять символы и строки в C немного лучше, спасибо. – user3408678

+0

YAY. - Вот самое важное, что помогло мне ... узнать, что в C нет разницы между c char-указателем и c char-массивом и строкой. – Hogan

+0

Я не думаю, что это точное утверждение. Я изучаю, что указатели и массивы могут использоваться для многих из одних и тех же вещей, но на самом деле это не одно и то же. – user3408678

1

Вы должны определить массив char, чтобы фактически сохранить в нем строку, строка в основном упорядоченная коллекция символов, поэтому C-строки становятся довольно интуитивными через некоторое время. Для «bob» вам нужно char name[4];, так как «bob» будет хранить 4 символа (читайте о завершении NULL). Но для «stan» вам нужно 5 символов, поэтому вам нужно заранее знать, что вы будете хранить в строке. Чтобы передать массив функции, которая принимает указатель, просто вызовите f(&y, name), поскольку массив деградирует к указателю на его первый элемент при передаче функции (в C и C++ в большинстве случаев массив можно рассматривать как указатель). Этого будет достаточно для правильной строки с нулевым завершением, обычно вы также добавляете int в качестве параметра, чтобы сообщить функции, что такое размер массива. Если вы хотите назначить строковый литерал типа «stan» для массива char (указатель на char) в f, не разыщите указатель, напишите name="stan";, так как char* - это что-то вроде char[]. Иногда смешение массива и указателя может вызвать у вас головокружение, но когда вы его повесите, вам будет легко, то же самое с C-строкой.

+0

Спасибо за объяснение – user3408678

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