int (*v)[10];
在 Visual C++ 里面不能與 int **v 等同起來。
舉個例子:
int **p;
int (*v)[10];
int a[10][10];
如果寫 v = a 是可以的。
如果寫 p = a 將會引起一個類型不匹配的編譯錯誤。
二級指針(int **p)需要自己指向一個一級指針,而二維數組則
不是這樣。編譯器為了節省空間和時間,沒有采用指針指向指針的方法,而是將數組現
行地存放在內存中。這樣一來,int (*v)[10] 也就成了 C 語言的一種特殊語法,它只
能表示 v 指向第一維具有 10 個元素的二維數組的頭部。這樣 v 的類型與 a[10][10]
正好匹配,v 的類型與 b[5][10](比如說定義了 b)也是匹配的。但是 v 不能匹配
c[5][5] 因為 c 的內存分布中每隔 5 個元素就把第二維的下標加一。
可以這樣寫,呵呵…… 復制代碼 這樣 pointer 也可以作為二維數組來使用,但是每兩個下標相鄰的元素在內存中的地址不一定
是相鄰的,而且還有 10 個一維指針占用內存空間作為橋梁。
?char **str1=NULL;
?char *x="zhang";
?str1=&x;
在 Visual C++ 里面不能與 int **v 等同起來。
舉個例子:
int **p;
int (*v)[10];
int a[10][10];
如果寫 v = a 是可以的。
如果寫 p = a 將會引起一個類型不匹配的編譯錯誤。
二級指針(int **p)需要自己指向一個一級指針,而二維數組則
不是這樣。編譯器為了節省空間和時間,沒有采用指針指向指針的方法,而是將數組現
行地存放在內存中。這樣一來,int (*v)[10] 也就成了 C 語言的一種特殊語法,它只
能表示 v 指向第一維具有 10 個元素的二維數組的頭部。這樣 v 的類型與 a[10][10]
正好匹配,v 的類型與 b[5][10](比如說定義了 b)也是匹配的。但是 v 不能匹配
c[5][5] 因為 c 的內存分布中每隔 5 個元素就把第二維的下標加一。
可以這樣寫,呵呵……
- #include<stdio.h>
- #include<stdlib.h>
- int main()
- {
- ? ? ? ? //local declarations
- int **pointer;
- int count;
- int i;
- int *p;
- ? ?
- //statements
- ??pointer= (int **)malloc (sizeof(int *) *10);
- ??for( count=0; count < 10; count++ )
- ? ?? ?pointer[count]=(int *)malloc(sizeof(int) * 10);
- ??
- ??for(count=0; count< 10; count++)
- ? ? ? ? {
- ? ? ? ?? ? p=*(pointer+count);
- ? ?? ? for(i=0; i<10; i++)
- ? ? ? ?? ?? ?? ???*(p+i)=count;
- ? ? ? ? }//for
- ??for(count=0; count<10; count++)
- ? ? ? ? {? ?
- ? ? ? ? ? ? ? ? ? ? ? ? for(i=0;i<10;i++)
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???printf("%6d",*(*(pointer+count)+i));
- ? ? ? ? ? ? ? ? ? ? ? ???printf("\n");??
- ? ? ? ? }//for
- return??0;
- }//main
是相鄰的,而且還有 10 個一維指針占用內存空間作為橋梁。
?char **str1=NULL;
?char *x="zhang";
?str1=&x;