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));
}
用行指針