指向参数变量的指针及其工作原理?例如function(int ** ptr)

时间:2018-03-02 09:06:46

标签: c function pointers

我正在编写代码来了解当指针作为函数中的参数传递时会发生什么。

void ptrTest(int **arg_ptr); 

int main() {
    int some_var = 5;
    int *ptr1;
    ptr1 = &some_var;

    printf("Address of some_var: %u\n\n", &some_var);
    printf("Value stored in *ptr1 (references to some_var): %u\n", ptr1);
    printf("Address of *ptr1 variable: %u\n\n", &ptr1);
    ptrTest(ptr1);
}

void ptrTest(int **arg_ptr){
    printf("Value stored in **arg_ptr (references to some_var): %u\n",arg_ptr);    
}

结果如下:

Address of some_var: 3119323004

Value stored in *ptr1 (references to some_var): 3119323004
Address of *ptr1 variable: 3119322992

Value stored in **arg_ptr (references to some_var): 3119323004

我很惊讶arg_ptr获取引用some_var地址的值。我期待** arg_ptr指向* ptr并存储值3119322992(引用* ptr的地址)。

当我测试指向函数外部指针的指针时,它确实以这种方式运行。为什么它指针指针作为参数的不同让我感到困惑。

你能告诉我这里发生了什么吗?

2 个答案:

答案 0 :(得分:2)

首先是什么是指针? C / C ++中的指针就像任何其他类型的变量一样,类型为int,char等。但这个变量的特点是与其他变量不同,它只保存内存位置的地址。同样,内存位置也可能是指针变量或任何其他常规变量(int或char)。

现在什么是指针指针?一个可以存储指针变量地址的变量,该指针变量可能包含另一个变量的地址,如: -

 int i = 10; //`i` is assign with a value  10 and `i` has its own address which we can get by `&i`;

 int *ptr1 = &i;// now ptr1 is pointer to `i` means ptr1 is assign with the
 //address of `i` hence if we dereference the address of *ptr1 we will get the value stored at that memory location

现在你的情况

 void ptrTest(int **arg_ptr){
    printf("Address store in of **arg_ptr: %u\n",arg_ptr);    
}

所以这里它的工作方式如下

int **arg_ptr = ptr1;//Wrong, `ptr1` is assign to `arg_ptr`, which is wrong because `arg_ptr` is a pointer to pointer type

所以在这里你应该存储一个指针的地址,但是你要存储一个变量int的地址i。     因为i的地址已在语句int * ptr1 =& i中分配;到ptr1。     正确的任务是

arg_ptr = &ptr1; //address of a pointer not address of a int variable.

现在首先取消引用: -

  *arg_ptr; //value of a pointer ptr1 that means address of `i`

 *(*arg_ptr); or **arg_ptr;// we further dereferenced the address of ptr1 here, which is value 10

现在你应该调用你的函数如下: -

ptrTest(&ptr1);// address of a pointer.

答案 1 :(得分:1)

ptrTest期望参数类型为int **,但您传递int*。你的编译器应该抱怨。您需要将ptr的地址传递给该函数。

ptrTest(&ptr1);  

除此之外,您应该使用%p规范来打印地址。

printf("Address of some_var: %p\n\n", (void*)&some_var);