2017-02-06 16 views
-4
#include <stdio.h> 
#include <stdlib.h> 

int foo(int **asciiSum); 

int main(void) 
{ 
    int asciiSum; 
    asciiSum = 0; 

    int* pointToAsciiSum; 
    *pointToAsciiSum = &asciiSum; 

    printf("%d\n",*pointToAsciiSum); //prints 0 
    foo(pointToAsciiSum) 
    printf("%d\n",*pointToAsciiSum); //prints 2 

    return 0; 
} 
int foo(int** asciiSum) 
{ 
    *asciiSum = 2; 
    return 0; 
} 

Как я могу избавиться от предупреждений?Передача указателей в c

Предупреждения:

предупреждение C4047: 'функция': 'INT ** отличается уровнями косвенности от 'междунар *' // происходит при вызове Foo

предупреждение C4024: 'Foo': разные типы для формального и фактического параметра 1 // происходит при вызове foo

предупреждение C4047: '=': 'int *' отличается в уровнях косвенности от 'int' // встречается в foo при присвоении 2 * asciiSum

+0

Неопределенное поведение для использования значения объекта с автоматической продолжительности хранения в то время как он является неопределенным. – EOF

+0

@EOF Ваши объяснения не применяются. – BLUEPIXY

+0

@BLUEPIXY Черт его нет: 'int * pointToAsciiSum; * pointToAsciiSum = & asciiSum; 'использует указатель (который является объектом с автоматической продолжительностью хранения), пока он неопределен. Подумайте, если это так, это также является нарушением ограничения, которое вызывает вопрос, где соответствующее предупреждение компилятора. – EOF

ответ

1
int* pointToAsciiSum; 
*pointToAsciiSum = &asciiSum; 

должен быть

int* pointToAsciiSum; 
pointToAsciiSum = &asciiSum; 

Вы хотите присвоить указателю, а не к int, к которому (неинициализированные) указатели точек.


int foo(int** asciiSum) { 
    *asciiSum = 2; 

должен быть

int foo(int* pointToAsciiSum) { 
    *pointToAsciiSum = 2; 

Давайте использовать последовательные имена. Основная проблема заключается в том, что sub ожидает указатель на указатель, но в этом нет необходимости. Вы хотите изменить int, так что вам просто нужен указатель на то, что int.


Все вместе, без всяких дополнительных указателей:

#include <stdio.h> 

void foo(int* num_ptr) { 
    *num_ptr = 2; 
} 

int main(void) { 
    int num = 0; 
    printf("%d\n", num); 

    foo(&num); 
    printf("%d\n", num); 

    return 0; 
} 
+0

Вау, почему большинство учебников по указателям чересчур запутывают? Этот формат дает больше смысла, спасибо! –

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

  • Нет связанных вопросов^_^