書上
int a[m][n];
int (*p)[n];
p=a或p=a[0]
這里a[0]不是指第0行第0列的地址嗎,怎么可以賦值給p,p不是行指標嗎。
uj5u.com熱心網友回復:
堅持你的理解,不能那樣賦值。uj5u.com熱心網友回復:
嚴格說p=a[0]是語法錯誤的,如果嚴格進行語法檢查的話: 賦值陳述句兩邊的型別運算式應相等或相容。p=a是可證相等的:a的型別=int [m][n]=int([m])[n],由于一維陣列[m]可視為單重指標*,故上式=int(*)[n]=p的型別。而p=a[0]的正當寫法應為p=&a[0],兩邊的型別才是等價的,關于型別決議和等價性證明參見《C++程式設計精要教程》。要入C語言之門,必須掌握型別運算式的決議、運算和等價性證明,80%的錯誤都與此有關。此外,大部分編譯器不支持多維動態陣列: 直接用m,n二維動態是不允許的,只允許第一維動態。uj5u.com熱心網友回復:
理解和討論之前,請先學會如何觀察!僅供參考:
//char (*(*x[3])())[5];//x是什么型別的變數?
//
//分析C語言宣告,關鍵是搞清楚這個變數是個什么東西(函式、指標、陣列),
//是函式那么剩下的就是他的引數和回傳值,
//是指標那剩下部分是說明他指向什么,
//是陣列剩下的部分就是說明陣列的成員是什么型別。
//決議C語言宣告規則:
//從左側第一個識別符號開始,按照優先級進行結合。*表示是..的指標,const表示只讀的,volatile表示可變的,[]表示是陣列,()表示是函式。
//
//x和[3]結合說明是一個大小為3的陣列,該陣列的每個元素為一類指標,該類指標指向一類函式,該類函式無引數,回傳一類指標,該類指標指向一個大小為5的char型陣列
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
return #
}
int main() {
char (*(*x[3])())[5];//是個陣列,大小為3
char (*(*x0 )())[5];//陣列的元素,是個函式指標
char (*( x00 )())[5];//函式原型,引數為空,回傳值為指標
char (* x000 )[5];//回傳值
x0 = x00;
x[0] = x0;
x[1] = x0;
x[2] = x0;
printf("typeid(x).name() is %s\n",typeid(x).name());
return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]
uj5u.com熱心網友回復:
不要迷信書、考題、老師、回帖;要迷信CPU、編譯器、除錯器、運行結果。
并請結合“盲人摸太陽”和“駕船出海時一定只帶一個指南針。”加以理解。
任何理論、權威、傳說、真理、標準、解釋、想象、知識……都比不上擺在眼前的事實!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247342.html
標籤:C語言
上一篇:怎么搞
