討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 網路投保旅行平安險 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
指標指標
更改我的閱讀文章字型大小
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/27 下午 05:17:21
#include <iostream>
using namespace std;
void func1(char arr[10])
{
cout<< sizeof(arr) << endl;//這是4
cout<< "======" << endl;
char arr2[10];
cout<< sizeof(arr2) << endl;//;這是10

}
int main(int argc, char* argv[])
{
  char czTemp[10]={0};
  func1(czTemp);
  return 0;
}
常看到這有人這樣用
void func1(char arr[10]);
但是形式參數的陣列10是無效的(更有可能會誤導)
編譯器會自動轉成
void func1(char* arr);
所以不要對形參陣列取sizeof()<-取到的可能取預期不符

但是:void func1(char arr[][10]);
二維陣列傳送時,數字10是有效的,這可以讓編譯器判定前方的[]每進位一次時pointer要shift多少成員

int nData = 5;
int* pIntTemp = &nData;
更多人寫成int *pIntTemp = &nData;
*pIntTemp = 4;//這個使nData=4
pIntTemp 是個指標,形別是 int*
pIntTemp指向 (*pIntTemp),而(*pIntTemp)的形別是int
所以int (*pIntTemp)這樣比較容易理解
同理
int** ppTemp = &pIntTemp;
ppTemp 是個指標,形別是int**
ppTemp 指向(*ppTemp ),而(*ppTemp )的形別是int*
看成int* *ppTemp;

只要有形別就有大小,編譯器才可以正確的shift
例:
sizeof(int*)==4;
sizeof(char*)==4;
sizeof(char)==1;
而pointer的內容值存的是所指向的地方第一個位址
而它應該佔用的大小由所指向的形別來決定
例:
char cTemp = 'a';
char* pTemp = &cTemp;
sizeof(pTemp)==4;
sizeof(cTemp)==1;
又例:
char ArrTemp[10]={'1','2','3','4','5','6','7','8','9','0'};
int* pint = (int*)ArrTemp;
pInt++;
char* pchar = (char*)pInt;
cout << (*pChar) << endl; //5

所以對指標的運算是
pInt++視為 char* pStart 加上sizeof(int*)

所以指標除了本身的型別之外,其所指向的型別也很重要
這就好像去電影院買票
有人單獨去看
有人買雙人座
有人買VIP(4人連座)



 




作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/27 下午 05:23:16
>>pInt++視為 char* pStart 加上sizeof(int*)
更正
pInt++視為 char* pStart 加上sizeof(int)
也就是
pInt++視為 char* pStart 加上sizeof(*pInt)



作者 : gn00446610(烈日神川)
[ 貼文 119 | 人氣 0 | 評價 290 | 評價/貼文 2.44 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/27 下午 11:02:29
>>常看到這有人這樣用
>>void func1(char arr[10]);
>>但是形式參數的陣列10是無效的(更有可能會誤導)
>>編譯器會自動轉成
>>void func1(char* arr);
>>所以不要對形參陣列取sizeof()<-取到的可能取預期不符

>>但是:void func1(char arr[][10]);
>>二維陣列傳送時,數字10是有效的,這可以讓編譯器判定前方的[]每進位一次時pointer要shift多少成員
請樓主想清楚你在講什麼?
請先弄清楚指標的動作是什麼?
請先弄清楚指標跟陣列的。
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/28 上午 05:49:33
有你的理論儘可以提出
憋在肚子中是會內傷的

void func2(char arr[][4])
{
arr[1][5]='k';//Compiler知道要翻成*(arr+1*4+5)
return;
}
char ArrTemp2[3][4]={{'1','2','3','4'},{'5','6','7','8'},{'9','0','a','b'}};
//呼叫前印出內容
func2(ArrTemp2);
//呼叫後印出內容

提示:
void func3(char arr[][4])
{
arr[1][6]='k';
     return;
}
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/28 上午 07:14:49
提示二:
void func4(char arr[][4])
{
arr[1][-1]='k';
return;
}
作者 : angleevil(邪月) 貼文超過200則人氣指數超過10000點
[ 貼文 485 | 人氣 18722 | 評價 720 | 評價/貼文 1.48 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/28 上午 11:23:41

>>>常看到這有人這樣用
>>>void func1(char arr[10]);
>>>但是形式參數的陣列10是無效的(更有可能會誤導)
>>>編譯器會自動轉成
>>>void func1(char* arr);
>>>所以不要對形參陣列取sizeof()<-取到的可能取預期不符
>
>>>但是:void func1(char arr[][10]);
>>>二維陣列傳送時,數字10是有效的,這可以讓編譯器判定前方的[]每進位一次時pointer要shift多少成員
>請樓主想清楚你在講什麼?
>請先弄清楚指標的動作是什麼?
>請先弄清楚指標跟陣列的。

To 神川
樓主的意思是
c在函式中,只能依靠指標回傳修改的內容
往往有人會用char arr[10]當參數,
實際上編譯器會當成char *arr
因此sizeof(arr)的值是4,並非真正arr的size(4*10)

至於二維陣列當參數傳遞時,
必須明確告訴編譯器colmun的數量,
這樣在offset時才不會出錯.
但是也算不出真正的size

至於jonay應該是點出常犯的錯誤,
並沒有搞混pointer和array的觀念
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/28 下午 02:46:18
一個典型的例子
#include <iostream>
using namespace std;
void func(char arr[10])
{
for(int n=0; n<10; n++)
cout<< arr[n] << endl;
return;
}
int main(int argc, char* argv[])
{
  char czTemp[5]={'1','2','3','4','5'};
  func(czTemp);
  return 0;
}
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/28 下午 11:22:38
以下這個宣告不容易看懂吧 ^^
它是正確的喔

int (*total(int x,int y))[4];
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/28 下午 11:41:06
>>int (*total(int x,int y))[4];

其實不易解讀的最好不要用在程式中
否則解讀的與編譯器認知的不符,很容易陰溝娷蔡

我的直覺是
total是一個pointer (function pointer) 陣列(可存四個成員)
它指向某一"類"的函式
此類函式的原型是 int func(int x,int y)
傳入二個int,並回傳一個int

作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/29 上午 01:14:36
上當
int (*total(int x,int y))[4];

一個total(int x, int Y) function
回傳指向 int 陣列的指標(含4 個int 元素)

分解:
typedef int (*PARA)[4];
typedef PARA total(int x,int y);

例:
int func(void) [4];//非法
回傳具有4個int元素的陣列的函數
但是陣列名只能當右值(函數返回值不能爲陣列,接收方也會是一個陣列)
所以回傳指向該陣列的指標
int (*func(void)) [4];



作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/29 上午 09:41:10

答案正確,接下來有沒有辦法實作出來,傳回指定格式的回傳值

>>>int (*total(int x,int y))[4];
>
>其實不易解讀的最好不要用在程式中
>否則解讀的與編譯器認知的不符,很容易陰溝娷蔡

關於這點以下這文寫得很好,值得看看

http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/29 上午 10:30:01
>>http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/

真的是很好的一篇文章
有時候想,一個老師一年最多影晌50個人(乘上班級數)
而一個書的作者一次影晌的是一堆人

這讓我想到小時候(完了....又想到小時候了。莫非真的年紀大了<-應該是長大後沒有什麼值得記憶的東西)
在廟中看到的勸世文
說(書生)寫淫書是要下地獄的("當時"真的很害怕)
從那時起立誓以後絕不寫書(不好的觀念害自已就好,不用去害別人)



作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/29 上午 11:13:41
//這應該很好理解
#include <iostream>
using namespace std;
int nArray[4]={1,2,3,4};
int (*total(int x,int y))[4]
{
nArray[0]=x;
nArray[1]=y;
nArray[2]=x;
nArray[3]=y;
return &nArray;
}
int main(int argc, char* argv[])
{
  cout << nArray[0]<< nArray[1]<< nArray[2]<< nArray[3]<< endl;
  int(*pDa)[4];
  pDa = total(7,8);

  cout << (*pDa)[0] << endl;
  cout << (*pDa)[1] << endl;
  cout << (*pDa)[2] << endl;
  cout << (*pDa)[3] << endl;

  cout << nArray[0]<< nArray[1]<< nArray[2]<< nArray[3]<< endl;
  return 0;
}
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/29 下午 02:37:08

>//這應該很好理解
>#include <iostream>
>using namespace std;
>int nArray[4]={1,2,3,4};

若限制不可以用 global 變數怎辦
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/29 下午 08:05:21
另一個有問題的例子:
#include <iostream>
using namespace std;
void func(char arr[10])
{
int nLen = sizeof(arr)/sizeof(arr[0]);//看起來很正常
for(int n=0; n<nLen; n++)
cout<< arr[n] << endl;
return;
}
int main(int argc, char* argv[])
{
  char czTemp[5]={'1','2','3','4','5'};
  func(czTemp);
  return 0;
}
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/29 下午 08:28:24
>>若限制不可以用 global 變數怎辦
其實我不喜歡使用static類的變數
簡單的說是"化外之民"
只能讓其生,卻不能控制其死

這讓我想到當神在造人的時候
若是只使某種生物生,但是卻不限制它的壽命的時候怎麼辦?
很快的你會發現這個星球上的所有動植物會被吃光光
最後全星球只會剩下這種生物,並且互吃

這種設計是有問題的
怎麼解決?
一來可以設計大水滅世(每隔一段時間消滅一部份的人,但是卻沒有選擇性<-很多剛初生的嬰兒會很倒霉<-佛家稱為共業)
二來可以設計當使用土地達80%的時候發生天災(但有可能掌控不好)

像不像某些程式語言GC的設計?
如果這些設計是可信賴的也就算了
問題是這些地基類的東西隨時可能會裂開
不要說在上面蓋房子,光是站在上面都會很恐怖








作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/30 上午 10:55:44
不管是用 global 變數還是用 local static 變數, 都會有下面的問題

#include <iostream>
using namespace std;
int nArray[4]={1,2,3,4};

int (*total(int x,int y))[4]
{
  nArray[0]=x;
  nArray[1]=y;
  nArray[2]=x;
  nArray[3]=y;
  return &nArray;
}

int main(int argc, char* argv[])
{
  int(*Mr_A)[4];
  int(*Mr_B)[4];

  Mr_A = total(70000,80000);
  Mr_B = total(7,8);

  cout <<
    "A 先生存款餘額" << endl << endl <<
    " 美金:" << (*Mr_A)[0] << endl <<
    " 歐元:" << (*Mr_A)[1] << endl << endl;

  cout << "A 先生大喊:\"夭壽喔!!吃錢哦∼∼∼\"" << endl;


  return 0;
}
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/30 下午 12:31:46
其實只要
global
heap
stack
static
各建一個變數並取其位址

你就知道static平時都跟著誰混
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/30 下午 12:53:23
實作一個來看看吧
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/30 下午 11:45:24
>>>>int (*total(int x,int y))[4];
>>
>>其實不易解讀的最好不要用在程式中
>>否則解讀的與編譯器認知的不符,很容易陰溝娷蔡
>關於這點以下這文寫得很好,值得看看
>http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/

int (*total(int x,int y))[4];
^--這個宣告並不是不易解讀,只是少用,其實它是很"標準"的宣告法。
int VarName[4];//<--這個宣告沒有人說它"不易解讀"吧?
int FuncName(...)[4];//<--和上面的語法一樣,只是變數宣告改為函式而已
int (*FuncName(...))[4];//--<這樣呢?換湯不換葯,函式宣告改成函式指標而已
"最好不要用在程式中",該用就用,認知錯誤就加強自己的認知能力才對。
至於這個連結文章:http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/
int (*total(int x,int y))[4];的議題好像搭不上邊。
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 12:01:22
int (*FuncName(...))[4];//--<這樣呢?換湯不換葯,函式宣告改成函式指標而已


???函式指標???

看來上面都白寫了
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 01:00:51

>int (*FuncName(...))[4];//--<這樣呢?換湯不換葯,函式宣告改成函式指標而已
>
>
>???函式指標???
>
>看來上面都白寫了

那不是函數指標
還在等你的實作內
回傳值不難做
但有盲點
考驗一下自己吧
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 01:45:19
等誰?等我?
你不是要用heap實做吧?
如果是的話
請看這一篇

http://www.programmer-club.com.tw/ShowSameTitleN/c/42002.html

作者 : angleevil(邪月) 貼文超過200則人氣指數超過10000點
[ 貼文 485 | 人氣 18722 | 評價 720 | 評價/貼文 1.48 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 08:33:24
他應該是要用參數形式回傳內容
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 10:13:37
>>int (*FuncName(...))[4];//--<這樣呢?換湯不換葯,函式宣告改成函式指標而已
>???函式指標???
>看來上面都白寫了
抱歉!確實看錯括號了,但我要強調的是那不是什麼希奇古怪的語法。
重新修正一下:
int (*total(int x,int y))[4];
^--這個宣告並不是不易解讀,只是少用,其實它是很"標準"的宣告法。
(1)int VarName[4];//<--這個宣告沒有人說它"不易解讀"吧?
(2)int (*VarName)[4];//<--宣告一個變數型態為指標,指向int[4]
(3)int (*FuncName(...))[4];//--<這樣呢?換湯不換葯,宣告一個函式為型態指標,指向int[4]
再次強調,我要說明的是從(1)到(3)的語法是同樣的模子:
VarName相當於(*VarName)相當於(*FuncName(...))
原諒coco已有老花,若再看錯,請直接指正或修正。
謝謝!






作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 10:39:57
大家就把它當益智遊戲實作一次看看
其實裡面是有陷井的
蠻有趣的
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 10:43:51
再次抱歉,我並沒有看完所有的貼文,所以有時會答不對題。
回完文後我多看了幾篇。
是在討論 static/global 該不該用?
還是該不該用 int (*total(int x,int y))[4];?
cxxlman在等什麼實作?
看得我又眼花了@X#$%
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 11:14:58

>再次抱歉,我並沒有看完所有的貼文,所以有時會答不對題。
>回完文後我多看了幾篇。
>是在討論 static/global 該不該用?
>還是該不該用 int (*total(int x,int y))[4];?
>cxxlman在等什麼實作?
>看得我又眼花了@X#$%

實作 int (*total(int x,int y))[4]; 這個宣告
但不要用 static/global
免得又發生上例 A 先生的悲劇
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 上午 11:30:00
我的本意是只要正確解讀、處理指標
指標並不可怕
(另一點是人寫的和編譯器的認知可能不符,關於這點cxxlman並沒有離題)

以上面的一貫方式解讀:

int (*VarName)[4];
VarName是一個指標,其形別是int (*)[4];
VarName指向(*VarName),而(*VarName)的型別是int () [4];

int (*FuncName(void) )[4];
FuncName(void)是一個function,它傳回一個指標,該指標的型別是int (* )[4];
如此宣告的和傳回的就可以匹配起來

同理
int (FuncName(void) )[4];//非法
FuncName(void)是一個function,它"想"傳回一個陣列int ( )[4];
但是編譯器會報錯(原因已上述)

至於cxxlman在等什麼實作?我也不知
除了global、stack、heap、static還有什麼配記憶體的方式?








作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 下午 02:42:50
>實作 int (*total(int x,int y))[4]; 這個宣告
>但不要用 static/global
>免得又發生上例 A 先生的悲劇
是說要寫一個int (*total(int x,int y))[4];的函式,
返回值不可以使用static/global 的指標嗎?
函式返回的指標要有意義,就是指向的容器需存在(不能是銷毁的容器)。
那麼除了static/global,再提除類別物件的成員等也是沒意義。
因為如寫成A 先生例子,都會有問題。
但重點不在於是否使用static/global在返回指標的函式,而是
A 先生程式誤用了static/global!
要這樣的誤用,那麼所有返指標的函式都會有問題,不只是返回陣列指標會出錯而已。
那麼做出"函式不能返回指標"的結論,會不會太武斷?
從大多數的C程式來看,返回指標的例子比比皆是!

若問我有沒有適合像這樣的函式:int (*total(int x,int y))[4];
有啊!例如查表法的,表格需要初始化:
const int Table1[4]={1,2,3,4};
const int Table2[4]={11,22,33,44};

const int (*GetTable())[4]
{
static const int (*pTable)[4]=NULL;
if (!pTable)
{
 if (!check something)
  pTable= &Table1;
 else
  pTable= &Table2;
}
return pTable;
}

int main()
{
const int (*pTable)[4];
pTable= GetTable();
:::::::::::::::::::::::::::::::::::::
return 0;
}


作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 下午 02:58:01
>int (FuncName(void) )[4];//非法
>FuncName(void)是一個function,它"想"傳回一個陣列int ( )[4];
>但是編譯器會報錯(原因已上述)
補充一下:int (FuncName(void) )[4]的語法本身並沒有錯,
只是C/C++的函式不支援返回陣列(以後說不定會支援^^)
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 下午 03:03:07
本來想過年到了,弄場魔術表演,看來魔術師不好當,哈哈...我搞砸了 ^^

這題目是要利用人性的盲點:

1. 人總是依過往的知識和經驗來解決問題
2. 對於費盡心力所得到知識、經驗、定理....會更堅信和依賴

題目 int (*total(int x,int y))[4]; 一開始每個人都會依過
往的知識和經驗直覺認為是什麼,所以一開始多會上當,這時
就要想辦法讓對方花更多心力才得到真正的意思,而 jonay 也
太早找到了 :(

typedef int (*PARA)[4];
typedef PARA total(int x,int y);

這時我應該在 typedef int (*PARA)[4]; 這裡推波助瀾,讓
jonay 會繼續堅信和依賴才對,顯然我沒做好^^

若 jonay 能過於執著 PARA 的定義,用它來產生 total() 的
回傳值,會有點麻煩,若勉強做成以下這樣:

int (*total(int x,int y))[4]
{
  PARA *Tmp = new PARA;

  return *Tmp;
}

雖然不算正當,但就記憶體配置而言,也是可行的,這時我就會
繼續出題要求 total() 能傳回 int[2][4] 的二維陣列,讓 jonay
掉入萬劫不覆的深淵 ^^

答案已呼之欲出,有沒有找到答案,還是掉入萬劫不覆的深淵 ^^

作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/1/31 下午 08:43:24
公佈答案

typedef int PARA[4]; // 只定義一維就好

int (*total(int x,int y))[4]
{
  PARA *Tmp = new PARA[2]; // 這樣就能得到 int[2][4]

  return Tmp;
}
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.25