void main()
{
int b[2][2]={1,2,3,4};
int **a;
a=b;
printf("b:%d, array:%d\n", b[0][0], **a);
printf("b:%d, array:%d\n", b[0][1], *(*a+1));
printf("b:%d, array:%d\n", b[1][0], **(a+1));
printf("b:%d, array:%d\n", b[1][1], *(*(a+1)+1));
}
但是在编译时报错了:error C2440: '=' : cannot convert from 'int [2][2]' to 'int ** '
这是怎么回事呢?我该怎么修改呢?
34 个解决方案
a与b的类型是不同的,当然不能这样赋值,a得这样定义才行:
int (*a)[2];
#include<stdio.h>
void main()
{
int b[2][2]={1,2,3,4};
int (*a)[2]=b;
printf("b:%d, array:%d\n", b[0][0], **a);
printf("b:%d, array:%d\n", b[0][1], *(*a+1));
printf("b:%d, array:%d\n", b[1][0], **(a+1));
printf("b:%d, array:%d\n", b[1][1], *(*(a+1)+1));
}
//这样也可以
#include<stdio.h>
void main()
{
int b[2][2]={1,2,3,4};
int *a=(int*)b;
printf("b:%d, array:%d\n", b[0][0], *a);
printf("b:%d, array:%d\n", b[0][1], *(a+1));
printf("b:%d, array:%d\n", b[1][0], *(a+1));
printf("b:%d, array:%d\n", b[1][1], *((a+1)+1));
}
int (*a)[2] 是个数组还是个二级指针呢?
int (*a)[2] int **a 有什么区别呢,好像都是二维指针呀!
可是就是int **a不能用啊,我该怎么才能用它呢?我现在想要做一个变长的二维矩阵,希望能用二维指针来表示。
楼主:
int a = 6;
int *p = &a;
int **q = *p;
这样能不能想通。
小弟也有个问题,大家看看;
char a[2][2]={'a','b','c','d'};
char (*p)[2]=a;
cout<<p[1]<<" "<<p[1][0]<<endl;
应该输出: cd c吧(中间空格)
为什么cd和c间又多了两个乱码了????
int **a;
*a = new int*[10];
for(int i = 0; i< 10; i++)
a[i] = new int[10];
这样就可以用 a[i][j]访问二维数组了。该数组为 10×10。
对草草兄的提示还是有些不明白。
二级指针指的也是地址,和一维的一样,这个我知道。但是我想知道为啥一维的指针可以直接指向数组名,而二级的直接指就出错呢?
也就是说int *a = b 可以,而int **a = b就不行了,why?
执行以下代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int **a;
int b[10][10];
a = (int**)b;
printf("a = %0X , b = %0X\n", a, b);
printf("a+1 = %0X , b+1 = %0X\n", a+1, b+1);
printf("a+2 = %0X , b+2 = %0X\n", a+2, b+2);
printf("a+3 = %0X , b+3 = %0X\n", a+3, b+3);
system("PAUSE");
return 0;
}
得到
a = 22FDD8 , b = 22FDD8
a+1 = 22FDDC , b+1 = 22FE00
a+2 = 22FDE0 , b+2 = 22FE28
a+3 = 22FDE4 , b+3 = 22FE50
Press any key to continue . . .
明白了吗
小弟也有个问题,大家看看;
char a[2][2]={'a','b','c','d'};
char (*p)[2]=a;
cout<<p[1]<<" "<<p[1][0]<<endl;
应该输出: cd c吧(中间空格)
为什么cd和c间又多了两个乱码了????
.............................................
cout<<p[1]; 你这样输出当然会乱码了没有'\0',又不是字符串
char a[][2]={"a","b","c","d"};
char (*p)[2]=a;
cout<<p[1]<<" "<<p[1][0]<<endl;
int (*a)[2] 是指针数组
二位数组 int b[2][2]实质上也是指针数组
例如可以这样 int *p; p=b[1]; 执行是没有问题的
而b[0]中保存的地址是&b[0][0]
就像 int buf[10]; buf保存&buf[0]一样
楼上
int (*a)[2] 是指针数组????///////应该是数组指针吧
int *a[2] 才是指针数组吧...
*************************************
那么这么说吧,我现在要用一个二维的矩阵来存储一些整形数值。但问题是这个矩阵的大小会不断变化,行和列都可能随时变化,所以我想用二级指针的方法来定义这样的一个姑且叫做可伸缩的矩阵吧,但是还是有没有想通的地方:对于每一次行列数量的变化,我是不是需要重新申请空间呢?对于这样的可变化的矩阵,怎么样来为它分配存储空间好呢?
各位大牛指点啦
用realloc来解决你的问题,简化代码如下:
int iRow, iColumn, * ipMatrix; //iRow为行数,iColumn为列数
...............
ipMatrix = (int *)malloc(iRow*iColumn*sizeof(int)); //为初始矩阵分配空间
.........................
ipMatrix = (int *)realloc(ipMatrix, iRow*iColumn*sizeof(int)); //假设iRow和iColumn出现了变化,就用realloc重新分配合适的空间
................................
访问y行x列元素的值的公式如下:*(ipMatrix+y*iColumn+x) //其中0<=y<iRow,0<=x<iColumn
Java中的List 或者linkedlist这些容器类解决你的问题正好,这些类可以存放任何类型的变量,数值等,甚至可以嵌套插入:
List myList = new List();
List RowList = new List();
RowList.insert(2);
RowList.insert(3);
myList.insert(tmpList);
c++的stl中的vector不知有没有这种功能.
使用realloc的话,原先矩阵里的数值会被自动定位到相应的位置上么?会不会出现偏差?
java。。。俺不懂哎。。。
stl正在学习中,这么说来,要去看看vector了
偏差是不会出现的。
如果新内存块的大小比原来的大,那么原来的数据都会全部保留,如果比原来的小,后面的数据会被截断。
int (*a)[2] int **a 都是二维指针呀!
但a=b时要考虑匹配
int **a; 所定义的a是一个指向指针的指针,而你的程序中定义的b是一个int型的数组,也就是说数组中的元素都是int型的,要获得这个数组中的元素,应该使用int * a;
而要是使用 int **a; 来指向数组中的元素,呵呵,程序会崩溃的, 因为此时 *a 已经指向你数组中的元素,而 **a 则以你数组中元素的内容为地址来访问,这肯定会出错的。
要使用指针来访问你的数组,有两种方法:
1、就是上面各位提出的,使用数组指针即 int (*a)[2];
2、就是使用int *a; a = &(b[0]);
一步之遥兄说的用指针数组来实现伸缩矩阵,具体该怎么做呢?可否再指点一二?
用 双指针指像2位数组没有意义。
2维数组和1维数组其实是一样的,首址是个地址,而不需要间接寻址。
int a[3][3];
int *b=&a[0][0];
也可以用指向2维数组的指针
int (*d)[3][3]=&a;
void main()
{
int b[2][2]={1,2,3,4};
int (*a)[2];
a=b;
printf("b:%d, array:%d\n", b[0][0], *(*(a+0)+0));
printf("b:%d, array:%d\n", b[0][1], *(*(a+0)+1));
printf("b:%d, array:%d\n", b[1][0], *(*(a+1)+0));
printf("b:%d, array:%d\n", b[1][1], *(*(a+1)+1));
}
用行指针