因此,我一直在用 C 语言做一些学习项目,并且开始对指针更加熟悉,但是我遇到了一些似乎找不到太多信息的现象。
基本上,我创建了一个数组,为了简单起见,我从一个整数数组开始:
int x[2] = {1, 3};
现在,如果我想修改这个数组的内容,我发现我可以创建一个函数,该函数以整数指针作为参数,并x
作为参数传递,并x
通过指定索引来取消引用。
#include <stdio.h>
void foo(int* input){
input[0] = 2;
input[1] = 4;
}
int main(){
int x[2] = {1, 3};
printf("x[0] before: %d\nx[1] before: %d\n", x[0], x[1]);
foo(x);
printf("x[0] after: %d\nx[1] after: %d\n", x[0], x[1]);
}
输出
x[0] before: 1
x[1] before: 3
x[0] after: 2
x[1] after: 4
这很有趣,但我并不经常看到这种做法,所以我不确定它是否可以接受。
现在,对于更大的问题,出于某种原因,每当我想通过指定新值和指针,然后将参数设置为该新指针来更改指针本身指向的地址时,它似乎只有在我执行以下操作时才有效:
#include <stdio.h>
#include <stdlib.h>
void foo(int** input){
int x[3] = {2, 4};
int** ptr = x;
*input = *ptr;
}
int main(){
int x[2];
x[0] = 1;
x[1] = 3;
printf("x[0] before: %d\n", x[0]);
printf("x[1] before: %d\n", x[1]);
foo(x);
printf("x[0] after: %d\n", x[0]);
printf("x[1] after: %d\n", x[1]);
return 0;
}
输出:
x[0] before: 1
x[1] before: 3
x[0] after: 2
x[1] after: 4
因此,我有几个问题似乎找不到答案,可能是因为我缺乏技术词汇:
1:每当我传递带有或不带有引用的数组作为参数时,为什么参数表现为指针数组,而没有初始化指针数组并将其设置为数组的地址?这样做会有什么意想不到的后果吗?
2:如果参数是一个指针,而不是指向指针的指针,那么将指针作为参数传递给像我一样接受双指针作为参数的函数是否可以接受,这样做是否存在我应该知道的未定义行为?
3:为什么这会起作用?