外贸网

  • 首页
  • 指向指针的指针做函数形参参数 指向指针的指针做函数参数

    作者:媒体   更新日期:2024.06.02
    楼主可以看一下有关书籍,作为参数的二级指针传递二维数组好像只有字符数组才可以,其他类型数组都不可以(这一结论在一个美国人写的书里面可以找到,具体书名如果感兴趣可以介绍给你)。此处你的形参该用,int (*MatrixA)[3]而不是int **MatrixA,另外两个参数也是这样。
    *(*(MatrixC + i) + j) += (*(*(MatrixA + i ) + j))*( *(*(MatrixA + k)+ j));
    上面这一行里面的*(MatrixC + i)表示什么?因为C作为实参已经让你转换成了一个普通的二级指针,所以MatrixC + i已经不再是数组C的第i行,而是一个指针变量(它指向了另一个指针)加了i 个单元而已,即 在数组C的地址的基础上加了 i*4(在vc编译环境中)个字节,而不是你所想的加了i*4*3,所以后面的*(MatrixC + i)已经不是你想象的结果,更谈不上后面的操作了。
    这点你可以通过 输出 C、C+1、(int **)C+1来感受一下。

    将最核心的一行积累加换成
    *(MatrixC + i * N + j) += (int)*(MatrixA + i * N + j)*(int)*(MatrixA + k * N + j);
    可运行,但与期望的C不符

    应该是内存访问越界了

    *(MatrixC + i * N + j) = 0; 这句貌似是有问题的, 会导致越界

    指向指针的指针做函数参数

    这说明你对指针理解还不够透彻。
    int **t;
    还没有分配内存能拿来t = b么?
    这个先不说,
    b[3][2]是2维的数组,所以
    int b[3][2]={{1,2},{1,2},{1,3}};
    不仅自己方便辨认也对你的代码清晰有好处
    至于你函数的传值,我不需要看你的函数就知道不行
    因为b[3][2]这样的数组,可以看成3行和2列,也可以看成
    3个指向2维数组的指针
    但是函数传值的时候编译器可以figure out数组前面的那一维,但是不能知道后面那一组的大小,所以你要明确指明后面的大小,所以prototype里要写
    int m[][a],a是一个值

    至于内存分配,比如
    我写个
    int *i, a;
    a = 10;
    *i = a;
    这个对么?明显不对,因为i是指针,没有分配过内存

    我不是中文学的,所以表述有点不清,但是malloc和指针是比较有难度的,慢慢来
    还有楼上那位兄弟写的挺好,这里提醒一下需要注意int *t[n]和int (*t)[n]相差甚远,所以留心。

    今天看了一下发现俺对你的意思理解有点偏差,不好意思,
    “指向指针的指针不是可以表示二维数组么?为什么传二维数组给**m 报错?”
    指向指针的指针可以表示二维数组,前提是你要先分配内存.
    比如
    int **t;
    t = (int **)malloc(3*sizeof(int *));
    这样t就是一个含有3个指针的数组,
    然后你再单独对每一个指针分配内存:
    int i;
    for(i = 0; i < 3; i++){
    t[i] = (int *)malloc(2*sizeof(int));
    }
    这样t才可以看做二维数组,
    而单单的int **t仅仅是指向一个指向整数的指针。
    所以你可以写
    int **t, *ptr, a;
    a = 10;
    ptr = &a;
    t = &ptr;
    但是不能直接用作函数原型里作为2维数组传值的形参。
    函数原型里要写作
    void MatrixChain(int *p,int n,int m[][6],int s[][6]);
    这样传值才是对的,原因参见我前面讲的
    这个就是解决方法

    你的问题本质就是指针和引用的区别,请参考以下链接
    http://zhidao.baidu.com/question/1638411952021780300.html?oldq=1

    只不过,你的问题中,被指针指向和引用的是另一个指针变量。假设指针的指针为pp,指针的引用为r,而被指向的指针为p,则:

    int a;//目标整数变量
    int *p=&a;//一级指针
    int **pp=&p;//二级指针
    int &R=&p;//指针的引用

    他们的关系用逻辑符号表示为:
    pp->p->a(PP的值为p的地址,p的值为a的地址,即pp指向p,p指向a,PP本身也需要占用内存空间,所以PP也有自己的地址)
    R=p->a(R引用p的地址,p的值为a的地址,即R是p的别名,p指向a,其中R的值就是p的地址,R本身不需要占用内存空间,也就没有自己的地址)

    因此,引用和指针变量的区别是,引用本身不占用内存空间,指针变量需要占用内存空间(凡是变量都需要占用内存空间,凡是占用内存空间必然有地址)。
    如还不明白可以追问。

    C语言指针作为函数参数,返回值为0
    答:那你应该用指针的指针才行,然后函数返回指针。double *a(double **p){ *p=... //修改指针所指向的地址 ... return *p; //返回指针p指向的地址}int main(){ double *p=... //初始化指针p double *q; //用于接收改变的指针 ... q=a(&p); //将指针p的...

    关于C指针形参的问题,指针作为形参传入,函数分配一个同类型指针指向形参...
    答:函数调用后,void Strdelspace(char* pStr)函数内的形参pStr就是a[0]的地址,可以++,---操作来移动pstr指针指向的位置,比如pStr++,就指向a[1]的地址了,如果解地址符读取的话,就是显示字符'b',这个理解吧。然后看函数,第一行我们有定义了一个函数内的指针并初始化char *pTmp = pStr;这个...

    C语言中 指针做函数参数传递二维数组
    答:include <stdio.h> void fun(int (*p1)[3],int (*p2)[3]);int main(){ int p1[3][3]={{7,8,9},{4,5,6},{1,2,3}} ;int p2[3][3] = {0};int i = 0, j = 0;fun(p1,p2);for(i = 0;i < 3;i++){ for(j = 0;j < 3;j++){ printf("%d ",*(*(...

    ...做函数参数是什么意思? 在什么情况下,函数参数才使用带指针的二维数...
    答:所以如果定义一个函数,参数二维数组,那么至少要指定列数,比如:void p (int a[2][3])//正确void p (int a[][3])//正确void p (int a[][])//错误void p (int a[2][])//错误那么如果你想要用指针来做参数传递二维数组,那你需要定义一个指向数组(大小等于二维数组列数)的指针,...

    用指针变量作为函数参数
    答:include <stdio.h> void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);int main(void){ int a=1,b=2;int *pa=&a,*pb=&b;swap1(a,b);printf("s1:a=%d,b=%d\n",a,b);a=1,b=2;swap2(pa,pb);printf("s2:a=%d,b=%d\n",a,b);a=1,...

    C++指针、数组、引用、变量作函数参数的问题
    答:如有函数声明:void swap(int a,int b); //功能是交换a,b值,但事实上对调用函数没有影响,因为swap函数的局部变量a,b在该函数执行完释放掉了,其值也就丢失了。2. 指针、数组作为参数,这是地址传递,指针和数组可以看成是指向一个或一片连续空间的指针(区别是:一个为变量地址,一个常量...

    指针变量能只能作为函数的形参不可以作函数的实参对还是错
    答:。数组名就是数组的首地址,实参向形参传递数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。这就好像同一件物品有两个彼此不同的名称一样。同样,指针变量的值也是地址,数组指针变量的值即为数组的首地址,当然也可以作为函数的参数使用。指针作为实参,指针作为形参:...

    ...的地址作为函数形参,以便将指向结构体变量的指针传递给它?_百度知 ...
    答:例如:定义一个结构体类型 struct Yearmonthday{ int year, month, day;};定义相关函数,参数类型指定为结构体类型指针 void input(struct Yearmonthday *p1) //函数形参p1是结构体指针类型{ printf("请输入年,月,日:"); scanf("%d,%d,%d",&p1->year,&p1->month,&p1->day);...

    为什么指针作为函数参数可以返回上级函数
    答:指针只能指向一个参数。指针就规定了此指针只能指向一个参数为int,返回值为int的函数。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以访问到函数外部的数据,并且这些数据不会随着函数的结束而被销毁。

    指针作为形参,为何可以改变指向元素的值而不可以改变自身的值
    答:参数传递有传值传递和传址传递,后者能够改变原变量的值 当你传一个普通变量进去时,想要改变原变量的值,就得把形参设定成对应类型的指针,并把原变量的地址放进去 若想要改变指针的值,就得把形参设定为对应类型的双重指针,就可以通过双重指针改变原指针的值 ...