Właśnie zacząłem studiować C, i kiedy robiąc jeden przykład o przejściu wskaźnika do wskaźnika jako parametru funkcji, znalazłem problem.Różnica między * ptr + = 1 i * ptr ++ w C
To jest mój przykładowy kod:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int* allocateIntArray(int* ptr, int size){
if (ptr != NULL){
for (int i = 0; i < size; i++){
ptr[i] = i;
}
}
return ptr;
}
void increasePointer(int** ptr){
if (ptr != NULL){
*ptr += 1; /* <----------------------------- This is line 16 */
}
}
int main()
{
int* p1 = (int*)malloc(sizeof(int)* 10);
allocateIntArray(p1, 10);
for (int i = 0; i < 10; i++){
printf("%d\n", p1[i]);
}
increasePointer(&p1);
printf("%d\n", *p1);
p1--;
free(p1);
fgets(string, sizeof(string), stdin);
return 0;
}
Problem pojawia się w wierszu 16, kiedy modyfikować *ptr+=1
do *ptr++
. Oczekiwanym wynikiem powinna być cała tablica i numer 1, ale gdy używam *ptr++
, wynik to 0.
Czy istnieje różnica między +=1
a ++
? Myślałem, że oba są takie same.
Należy zauważyć, że podany kod nie zostanie skompilowany, ponieważ nie zadeklarowano 'ciągu'. –
Pozostałe uwagi: 1) "allocateIntArray" jest złą nazwą, ponieważ wydaje się, że "malloc" jest tablicą z funkcji, ale nie robisz tego. Zamiast tego proponuję 'fillIntArray'. 2) Nie używasz zwracanej wartości 'allocateIntArray'. Proponuję zmienić typ zwrotu na "void". 3) Nie powinno być 'if (ptr! = NULL)' w funkcji 'increasePointer' to' if (* ptr! = NULL) '? 4) Gips w "malloc" jest niepotrzebny. Zobacz komentarz Sourava powyżej. 5) To: 'for (int i = 0; i <10; i ++) {printf ("% d \ n ", p1 [i]); } 'i' printf ("% d \ n", * p1); p1 -; 'musi być ujęte w' if (p1! = NULL) '. 6) 'string.h' nie jest używany. –
Powiązane: [++ na wskaźniku dereferencji w C?] (Http://stackoverflow.com/questions/859770/on-a-dereferencjonowany-pointer-in-c) –