首页 > c语言函数中传地址跟传指针有什么不同?

c语言函数中传地址跟传指针有什么不同?

c语言函数中传地址跟传指针有什么不同?

我定义一个指针把指针变量作为参数 和 定义变量把变量的地址作为参数有什么不同?

例如: 网上找到的:

函数定义:
int queue_init(queue *Q){
    Q->front = NULL;
    Q->rear = NULL;
}
函数调用:
...
queue Q;
...
queue_init(&Q);
...
错误函数调用:
...
queue *Q;
...
queue_init(Q);
...

为什么后者是错误的调用?


C语言中只存在按值传递这个概念。即便是指针,指针的值就是它所指向的地址,本质上,它也是值。
对于你上面的:

...
queue Q;  //这句声明,会让编译器为之分配内存空间
...
queue_init(&Q); //在这个调用中会解引用指针&Q,因此,&Q这个指针必须是合法的。
...
错误函数调用:
...
queue *Q; //声明了一个指向quque结构的指针Q,至于Q指向哪块内存区域,这里并没有指定。
//此时如果解引用指针Q,那么便是属于非法访问内存。
...
queue_init(Q); //很明显,这里的调用也就是非法的了。
...

变量的地址不就是指针的值么?本质上不都是传指针吗?

changeValue(int *val);

int a = 1;
int *p = &a;

changeValue(&a);
changeValue(p);

修改:

那是因为你的Q没有初始化,没有指向一块可用的内存!

queue *Q = (queue *)malloc( sizeof(queue) );
queue_init(Q);

有什么相同的吗?


你可以看看我简单总结的一篇文章:正确理解C/C++中的传值调用/传址调用/引用调用

【热门文章】
【热门文章】