user-0 提问: 关于二级指针的疑惑

回复:
user: user-1
content: 不懂，看看大神怎么说

user: user-2
content: 一定要使“每一级”的指针都得到初始化 使TA们准确的指向一个内存。静态内存、栈或堆都可以的。

user: user-2
content: 1. re      = (double **)malloc(2*sizeof(double *));若此语句执行成功，则re为“2个具连续地址的指向浮点数的一级指针”的首地址。    2. *re是“第一个指向浮点数的一级指针”的地址，但这个地址里的内容是不定的（未经过初始化，在使用**re之前，你还得再初始化*re）。所以下标访问方式(*re)[x]不能代表一个正确的内存（作值时代表一块内存）。而且x的最大值也只能为1。    你用笔在纸上画画，或许有点帮助的说    建议将指针初始化为NULL，然后在malloc后再判断一下指针是否为NULL后再使用。

user: user-3
content: CSDN的脚本嵌套出问题了！ 引用，代码，span  <引用>     <C++代码>         <红色高亮>         </红色高亮>     </C++代码> </引用>

user: user-3
content: 引用 楼主 u012789847 的回复:虽然知道二级指针是指向指针的指针   但是还是觉得有些疑惑的地方，以下是自己写的一个程序，就是矩阵求差，但是总是会报错，能否指点一下。  #include <stdio.h> #include <stdlib.h>    int function(double *p, int p_r, int p_c, double *q, int q_r, int q_c, double **re) { 	int i; 	int j;   	if(p==NULL||q==NULL){ 		*re     = NULL; 		return 1; 	}   	if(p_r!=q_r||p_c!=q_c){ 		*re     = NULL; 		return 1; 	}   	if(p_r*p_c>1024||q_r*q_c>1024){ 		*re     = NULL; 		return 2; 	}   	// *re指向的存储空间未分配，你自己补上吧！这个错误有CSDN的网友已经指出。 	for(i=0; i<p_r; i++){ 		for(j=0; j<p_c; j++){ 			(*re)[i*p_r+j]  = p[i*p_r+j]-q[i*p_r+j]; // 此处你怎么能将p_r行p_c列的数组按p_r列p_c行来处理呢，这个错误大部分CSDN网友都没有发现！ 		} 	}   	return 0; }   int main() { 	double  p[2][3] = {1,2,3,4,5,6}; 	double  q[2][3] = {1,1,1,1,1,1}; 	double  *re;   	int     i; 	int     j;   	function(p, 2, 3, q, 2, 3, &re);   	for(i=0; i<2; i++){ 		for(j=0; j<3; j++){ 			printf("%3d\n", re[i][j]); 		} 	}   	return 0; }   楼主的思维乱得像一坨浆糊！请看红色标亮的地方！ 正确的代码如下：  #include <stdlib.h>  int function(double *p, int p_r, int p_c, double *q, int q_r, int q_c, double **re) { 	int i; 	int j;     	if(p==NULL||q==NULL) 	{ 		*re     = NULL; 		return 1; 	}    	if(p_r!=q_r||p_c!=q_c) 	{ 		*re     = NULL; 		return 1; 	}    	if(p_r*p_c>1024||q_r*q_c>1024) 	{ 		*re     = NULL; 		return 2; 	}  	*re = (double *)malloc(p_r * p_c * sizeof(double));    	for(i=0; i<p_r; i++) 	{ 		for(j=0; j<p_c; j++) 		{ 			(*re)[i*p_c+j] = p[i*p_c+j]-q[i*p_c+j]; 		} 	}    	return 0; }  int main() { 	double  p[2][3] = {1,2,3,4,5,6}; 	double  q[2][3] = {1,1,1,1,1,1}; 	double  *re;    	int     i; 	int     j;    	function(*p, 2, 3, *q, 2, 3, &re);    	for(i=0; i<2; i++) 	{ 		for(j=0; j<3; j++) 		{ 			printf("%f ", re[i*3+j]); 		} 		printf("\n"); 	}  	free(re); 	re = NULL;   	return 0; }

user: user-2
content: 48:2: warning: passing argument 7 of 'function' from incompatible pointer type [enabled by default] 4:5: note: expected 'double **' but argument is of type 'double ***' 是因为：  double  **re; 为re动态分配空间后，re作为function的最后一个参数时不必再取地址。

user: user-4
content: 引用 4 楼 u012789847 的回复:In function 'function': 26:33: error: invalid operands to binary - (have 'double' and 'double *')  In function 'main': 48:2: warning: passing argument 7 of 'function' from incompatible pointer type [enabled by default] 4:5: note: expected 'double **' but argument is of type 'double ***' 错误提示这这样的  你这个错误就是申请内存时，返回的是一级的内存指针，你却将其当作二级指针来用，第二个错误就是将二级指针取地址，也就是变成三级指针当参数来调用，而事实上函数的参数应该是二级指针。

user: user-4
content: 指针事实上就是一个int，不过这个int的数值是一个内存地址，也就是指针就是用来保存一个地址的，也就是指向一个地址，当我们使用取值符*的时候，也就是到这个地址里取回其保存的值，二级指针很简单，就是这个指针里保存的是一个地址，按着这个地址找到的内存中保存的依然是一个内存地址。   (*re)[i*p_r+j]  = p[i*p_r+j]-q[i*p_r+j];  这一句是有很严重的问题的 你先声明了一个指针re，然后再用另一个指针指向这个指针，当你使用*re的时候，取的是你一开始声明的指针值，得到的结果就是一开始的double  *re，这个二级指针的使用是正确的。 但如果再次使用[]进一步读取的，也就是要读取double  *re所指向的内存就错误了，因为double  *re事实上是一个野指针，你根本没有给它赋值过 你可以这样用：double r[6]，然后是double *re = r;就可以了

user: user-0
content: In function 'function': 26:33: error: invalid operands to binary - (have 'double' and 'double *')  In function 'main': 48:2: warning: passing argument 7 of 'function' from incompatible pointer type [enabled by default] 4:5: note: expected 'double **' but argument is of type 'double ***' 错误提示这这样的

user: user-0
content: 1 #include <stdio.h>   2 #include <stdlib.h>   3   4 int function(double *p, int p_r, int p_c, double *q, int q_r, int q_c, double **re)   5 {   6   7         int i;   8         int j;   9  10         if(p==NULL||q==NULL){  11                 *re     = NULL;  12                 return 1;  13         }  14  15         if(p_r!=q_r||p_c!=q_c){  16                 *re     = NULL;  17                 return 1;  18         }  19  20         if(p_r*p_c>1024||q_r*q_c>1024){  21                 *re     = NULL;  22                 return 2;  23         }  24         for(i=0; i<p_r; i++){  25                 for(j=0; j<p_c; j++){  26                         (*re)[i*p_r+j]  = *(p+i*p_r+j)-(q+i*q_r+j);  27                 }  28         }  29  30         return 0;  31 }  32  33 int main()  34 {  35         double  p[]     = {1,2,3,4,5,6};  36         double  q[]     = {1,1,1,1,1,1};  37         double  **re;  38  39         int     i;  40         int     j;  41  42         re      = (double **)malloc(2*sizeof(double *));  43  44         for(i=0; i<2; i++){  45                 p[i]    = (double *)malloc(3*sizeof(double));  46         }  47  48         function(p, 2, 3, q, 2, 3, &re);  49  50         for(i=0; i<2; i++){  51                 for(j=0; j<3; j++){  52                         printf("%3d\n", (*re)[i*2+j]);  53                 }  54         }  55  56         return 0;  57 } 还是会出错    不知道中间有地方写错了没有？

user: user-5
content: 都没有为re分配内存啊，怎么玩呢？

user: user-6
content: （1）照你题目要求，根本不需要二级指针 （2）如果你要用二级指针返回，需要开辟内容空间