C语言二级指针问题

如果想要为指针P开辟一个空间,是不是要&p(P本来是一个指针)这样传递给另一个函数,另一个函数再用二级指针修改才可以?
但我有点迷惑p本来不是一个指针吗?如果直接把P传递过去不用取址符,然后另一个函数也是用一级指针接收这个地址再开辟空间不是可以改修了吗?它又不是值传递。

在函数参数传递中只有值传递。

要看传递的值是什么,如果是一个指针的值那么它就是地址了。否则就是普通的值。

你这里为什么要用二级指针呢?你认为p的值已经是一个地址了所以直接传它的值就可以搞定了。错误就在这里。你想想你为什么还要为p开辟空间。如果p的值已经是你要的地址了那还需要开辟空间吗。所以其实这里要么p的值是null要么是一个随即值,要么是一个地址但不是你要的。那么你把这样的值传过去有什么用呢。 所以这里你要弄清楚我们真正要修改时是哪个的内容。是p所指向的那个内存吗。还是p本身,显然这里要该是p本身的内容。那么你只把p的值传给一个函数这个函数能修改p的内容吗?显然不能了。

所以我们得把p本身的地址传过去。然后才能修改该地址的内容。所以就不得不用二级指针了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-04-16

1、通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上。之后就可以通过二维指针直接访问了。

2、参考代码如下,可以看具体注释辅助理解。

#include <stdio.h>//输入输出头文件。
#include <stdlib.h>//本程序需要用到malloc/free函数,引用该头文件。
int main()
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //定义二维数组a,并赋值从1-12.
    int ** p = NULL;//定义二维指针。
    int i, j;
    
    p = (int **)malloc(sizeof(int *) *3);//要访问的数组有三行,所以申请三个一维指针变量。
    for(i = 0; i < 3; i ++)
    {
        p[i] = a[i];//将二维数组行地址赋值到对应的一维指针上。
    }
    
    for(i = 0; i < 3; i ++)
    {
        for(j = 0; j < 4; j ++)
            printf("%d ", p[i][j]); //用指针输出元素。p[i][j]这里也可以写作*(*(p+i) + j)。
        printf("\n"); //每行输出后加一个换行
    }
    
    free(p);//释放申请的内存。
    
    return 0;
}

用二维指针访问二维数组多用于函数调用。
对于一维数组,如果函数参数为一维指针可以直接用数组名当做函数参数。但是如果函数参数为二维指针,直接用二维数组名做参数会出现访问出错,是因为二维指针和二维数组的访问方式不同造成的,需要如示例代码中做转换。
另外一种常用的方法是利用二维数组的内存连续性将二维数组转为一维数组处理,与本题无关,不做更多描述。

第2个回答  2010-08-21
C语言都是按值传递的。比如下面这段:

指针也不例外,比如void f( int* p )调用它时,只是把指针的值(它指向的东西的地址)传过去给另一个指针。
第3个回答  2010-08-21
//给你看段代码。
void MyPrintf(char *p)
{
printf("%c",*p);
}
//然后在main中
int main()
{
char *p;
char a='A';
p=&a;
MyPrintf(p);
return 0;
} /*这样就是直接把p指向的地址传给函数,函数并没有 另开辟地址,只是传了地址给调用的函数*/
相似回答