指向指针的指针做函数形参参数 指向指针的指针做函数参数
*(*(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的函数。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以访问到函数外部的数据,并且这些数据不会随着函数的结束而被销毁。
指针作为形参,为何可以改变指向元素的值而不可以改变自身的值
答:参数传递有传值传递和传址传递,后者能够改变原变量的值 当你传一个普通变量进去时,想要改变原变量的值,就得把形参设定成对应类型的指针,并把原变量的地址放进去 若想要改变指针的值,就得把形参设定为对应类型的双重指针,就可以通过双重指针改变原指针的值 ...