我有以下代码:
void dereference_pointer(int* pointer){
pointer = (int[]){1, 2, 3};
printf("%d | %d | %d\n", pointer[0], pointer[1], pointer[2]);
// This prints "1 | 2 | 3", like I wanted
}
int main(void) {
int *pointer;
pointer = malloc(sizeof(int)*3);
dereference_pointer(pointer);
printf("%d | %d | %d\n", pointer[0], pointer[1], pointer[2]);
// This prints "0 | 0 | 0", essentially undoing what happened inside the function
return 0;
}
我不完全确定pointer = (int[]){1, 2, 3};
是将指针指向新数组的正确方法,但这是我能做到的唯一方法,它不会给我类型错误。
答案 0 :(得分:2)
在pointer
内分配dereference_pointer
不会在函数外部更改pointer
,因为它是按值发送的。您可以将其更改为:
#include <stdio.h>
#include <stdlib.h>
// Note the ** instead of *
void dereference_pointer(int** pointer){
*pointer = (int[]){1, 2, 3}; // note dereferencing here
// and here and here and here :)
printf("%d | %d | %d\n", (*pointer)[0], (*pointer)[1], (*pointer)[2]);
// This prints "1 | 2 | 3"
}
int main(void) {
int *pointer;
pointer = malloc(sizeof(int)*3);
dereference_pointer(&pointer); // by reference
printf("%d | %d | %d\n", pointer[0], pointer[1], pointer[2]);
// This prints "0 | 0 | 0"
return 0;
}
这应该可以解决你最终得到的0 | 0 | 0
。
至于此:
我不完全确定pointer =(int []){1,2,3};
这很好。你的指针指向一个没问题的数组。当函数返回时,您将留下一个具有正确值的指针。
你可以改用这个美女:-P:
void dereference_pointer(int** pointer){
**pointer=1, *(*pointer+1)=2, *(*pointer+2)=3;
printf("%d | %d | %d\n", (*pointer)[0], (*pointer)[1], (*pointer)[2]);
// This prints "1 | 2 | 3"
}
但你的方式是一个单行且更易读的IMO。
答案 1 :(得分:1)
我并不完全确定指针=(int []){1,2,3};是指向新数组的指针的正确方法,但这是我能做到的唯一方法,它不会给我一个类型错误。
传递给函数的指针是数组。这是因为当作为参数传递时,数组会衰变为指向第一个元素的指针。因此,您需要传递数组中的元素数。 (知道数组的起始地址并没有告诉你有关结束的任何事情)。
示例:
void print(int *data, size_t n)
{
for (size_t i = 0; i < n; ++i)
printf("%d\n", data[i];
}
实际上,函数签名也可以写成
int data[], size_t n
调用者代码可能如下所示:
int *data = malloc(n * sizeof(int));
/* populate the dynamically allocated array */
print(data, n);
或者看起来像这样:
int data[MAX];
/* populate array */
print(data, MAX);