1樓:伊旋圭蒙
int**m;可以分步驟來理解
**m意思是引用這個整型數,*m代表指向這個整型數的指標,m代表指向*m的指標,也就是傳說中指向指標的指標
一般情況下形參為指標型別時,可以傳送陣列名作為實參,也即陣列的起始地址,二維陣列的可以看成是多個一維陣列組成的
2樓:匿名使用者
用這種二維指標是不能操作這種二維陣列的,二維指標就是指標的指標,而這種情況應該用陣列指標,另外,由於二維自動陣列也是順序存放的,所以可以用一維指標傳遞二維陣列的地址,以下程式分別用陣列指標(fun()函式)和一維指標(fun2()函式)操作相同的操作:
#include
void fun(int (*p)[3]) /*或者void fun(int p[3])*/
void fun2(int *p,int col) /*p指向二維陣列首元素的地址,col是二維陣列的列數*/
int main(void)
;fun(a);
printf("%d\n",a[0][2]);
fun2(&a[0][0],3);
printf("%d",a[0][2]);
return 0;
3樓:匿名使用者
p = &a;現在你可以給她賦值了
二維陣列a的“列指標”與“行指標”有什麼聯絡
4樓:king離歌無言
1.行指標與列指標區別是否是+1上的不同,例如a[0]+1是指a[0][1]的地址
而&a[0]+1是指a[1][0]的地址!除了上面還有其他的行指標與列指標表示方法嗎?只要有其功能就可!
——本質上不存在任何區別,n維陣列的儲存空間都是連續的,只不靜態宣告陣列時,編譯器幫你生成了根據下表訪問特定元素的**,如a[3][3],使用a[1][2]則編譯器幫你生成*(a+(3*1)+2)的指標訪問**,所以對於二維陣列,設n,m分別為其
一、二維,行指標:a+(n*行數),列指標:a+列數,在該位置的元素:a+(n*行數)+列數,不過用這種思維來理解陣列欠妥,特別是維數多的時候。
2.**a,*a[0]是否別代表a[0][0]這個元素,是否就代表a可以當作指標,還是有其他的
區別!能講一點也好?
——不代表,a本身就是指標,而且是個值不能改變的指標,除非陣列的元素是指標或多階指標
3.正如上面所說,a,a[0],&a[0][0]是指同一個地址,除了上述+1區別,還有麼?(可以從用法或其他方面說)
——轉變思維方法,陣列是線性儲存,就線性地去理解它
4.陣列a[3][3],為何這個不可以for(i=0;i<9;i++)
scanf("%d",a++);
而 for(i=0;i<9;i++)
scanf("%d",a+i);可以呢?
區別在哪?
——a是個不能改變值得指標,所以a++肯定是錯的
5樓:
沒有所謂的列指標與行指標。只有列下標與行下標,一級指標、二級指標。其實,二維陣列在記憶體中也是順序存放的。
從首地址開始,計算偏移就能遍歷整個陣列。a[i][j]中,列下標與行下標可以方便表示偏移而已。
6樓:
沒有“列指標”這個說法,程式中為了便於理解才用行和列來表示二維陣列,實際上資料是按順序存放的,也就是說物理上根本沒有行列的概念。
c語言二維陣列用指標表示的問題
7樓:匿名使用者
#include
void main()
;int (*p)[4];
p=a;
printf("%d",*(p)[3]);
}首先你沒有理解int (*p)[4];
他的意思就是含有4個指標的陣列 由於int a[3][4]只有3行,所以*(p)[3]這個地方就越界了
如果*(p)[2]地址中的值就是17 *(p)[1] 就是9 ,*(p)[0]就是1
如果你要列印7 *((p)[0]+3)
8樓:匿名使用者
因為p[3]沒有指向a[0][3],你加條語言
printf("%x\t%x\n", p[3], &(a[0][3]));
就知道了。
9樓:匿名使用者
printf("%d",(*p)[3]);
10樓:貴藹堂馨蓉
你說要放到另外一個陣列b中,但是沒看到你定義新的陣列,所以我就按我自己的理解做了。
#include
#define
rows
3#define
cols
4double
copy_ptr(double
*tar);//一個變數就夠了
//rows和cols本來就是define的,全域性intmain(void),,
,};double
*p=source[0];
printf("taget[%d][%d]=",rows,cols);
copy_ptr(p);
printf("\n");
while(1)
{}return0;}
double
copy_ptr(double
*tar)
}//直接輸出了……
return0;}
有問題歡迎**……
11樓:匿名使用者
#include
int main()
;int (*p)[4];
p=a;
printf("%d",*(*p+2));
return 0;
}//你沒有理
解多維陣列a的意思
指向二維陣列的指標
12樓:小舅舅有點帥
int(*p)[10]定義了一個指向二維陣列的指標p,賦給它10個長度,把a陣列的值賦給(*p)[10]。
注意,這裡是a陣列是5行10列的,放入(*p)[10]是把a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9]放入(*p)[0]中,同理,將a[1][0...9]放入(*p)[1]。
最後(*p)[10]中的值只有五行被初始化為a陣列的值了。
在本例中,p和p[0]是同一個意思,就是陣列a的起始地址,等價於cout
#include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
int a[5][10]=;
int (*p)[10]=a;
cout 0012feb8 0012feb8 #include #include "iostream" using std::cout; using std::endl; using std::hex; void main() int a[5][10]=; int (*p)[10]=a; cout<<*p 0012feb8 這是p和p[0]的區別就體現出來了。因為*p並不是取首元素的值,它這時才相當於p[0]。那如何通過p取得首元素的值呢,很顯然,應該再加一個*操作符,如下: cout<<**p<這時輸出結果自然就會和(*p)[0]一樣是1了。 擴充套件資料 設p是指向二維陣列a[m][n]的指標變數,則有: int* p=a[0];//此時p是指向一維陣列的指標。p++後,p指向 a[0][1]。 如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0]; 則p+j將指向a[0]陣列中的元素a[0][j]。 由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下: p+i*n+j 相應的如果用p1來表示,則為*(p1+i)+j 元素a[i][j]相應的指標表示為: *( p+i*n+j) 相應的如果用p1來表示,則為*(*(p1+i)+j) 同樣,a[i][j]也可使用指標下標法表示,如下: p[i*n+j] 例如:int a[3][4]=,,}; 則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是一個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。 若有:int *p=a[0]; 則陣列a的元素a[1][2]對應的指標為:p+1*4+2 元素a[1][2]也就可以表示為:*( p+1*4+2) 用下標表示法,a[1][2]表示為:p[1*4+2] 13樓:匿名使用者 一、你的 float score 陣列定義的是:一個3行、4列的二維浮點陣列,陣列的元素為浮點數。如果你換個格式書寫就清晰了! float score[3][4]=,,}; 在呼叫的過程中,score 就是這個陣列的首地址,指向的是浮點陣列。score + 1 指向的是陣列。 二、你的 float *p 定義的是:一個指向浮點數的指標。這個是一維的。 在呼叫的過程中,float 指向的是 xx。一個浮點數字。 兩個的定義不同,所以引數傳遞過程中會出錯。 三、你的 float (*p)[4] 定義的是:一個指向含有四個元素的浮點陣列的指標。 在呼叫的過程中,float 指向的是,由四個浮點陣列成的陣列。 這時兩個定義相同,所以引數傳遞過程中沒有錯誤。 四、有個建議,你的程式書寫格式不清晰,不利於你糾錯和修改,應該儘量的清晰、明確,不建議使用簡化方式定義引數。 作為一個軟體工作者,應該儘量使程式流暢、格式清晰、易讀,這是一個軟體工作者最基本的職業素養。 格式化後,程式如下,會清晰很多: #include void main() ,,}; search(score,2); } void search(float (*p)[4],int n)/*這裡的 float *p 好像有問題*/ printf("\n");} 14樓:匿名使用者 p[0]指向陣列a的起始地址 p[9]野指標 c語言怎麼用指標代替二維陣列 15樓:匿名使用者 1.設p是指向二維陣列a[m][n]的指標變數,則有: int* p=a[0];//此時p是指向一維陣列的指標。p++後,p指向 a[0][1]。 2.如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0]; 則p+j將指向a[0]陣列中的元素a[0][j]。 由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下: p+i*n+j, 相應的如果用p1來表示,則為*(p1+i)+j。 元素a[i][j]相應的指標表示為: *( p+i*n+j) ,相應的如果用p1來表示,則為*(*(p1+i)+j)。 同樣,a[i][j]也可使用指標下標法表示,如p[i*n+j]。 若有:int *p=a[0]; 則陣列a的元素a[1][2]對應的指標為:p+1*4+2 元素a[1][2]也就可以表示為:*( p+1*4+2) 用下標表示法,a[1][2]表示為:p[1*4+2] 用陣列指標來訪問 你有1個使用錯誤 訪問 ident num row num col 出界了應該 ident num row 1 num col 1 1個演算法錯誤 沒有根據行列值是否相等來判斷,相等才能賦值1.0而且每次迴圈p 有很多次 仔細看 會跳過很多元素,它們沒有賦值用i,j來定位行列很好做... include stdio.h include conio.h include stdlib.h main for i 0 i 4 i printf 此矩陣主對角線的和為 d n num include define m 4 int main int i,j,a m m sum 0 for i 0 ... 首先說明一下什麼是列指標。在c語言中,陣列是不同於普通變數的,實際上c定義的陣列是指向該陣列第一個元素的指標。這是第一個概念,即陣列名就是指標,所以可以直接當做指標來用,例如 對於一個陣列a,要取其第三個元素的值,既可以用a 2 也可以用a 2來訪問。對於一個二維陣列,如果用下標變數來表示的話,則可...指標二維陣列
定義二維陣列4 4,二維陣列中的陣列元素都用鍵盤賦值。求出該二維陣列中主對角線的和C語言
使用行指標和列指標輸出二維陣列元素