Re: [問題] c語言新手指標問題!

看板C_and_CPP作者 (Charlott.HonG)時間8年前 (2016/05/27 01:00), 8年前編輯推噓3(306)
留言9則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《jeson60 (神空暗夜)》之銘言: : 最近再透過看書自學 學到指標的時候有一題是 : 叫我利用指標運算以及函數來找出最大最小值 : 寫完以後卻在主程式使用函數的時候系統說無法讀取a的陣列 我之後尋求 : 朋友的幫助以後他將函數改成void srh(int a[][col],int *)就可以了 : 但我還是不懂為什麼不能讀取a的陣列! 想請教各位大大!! : 程式碼如下! : #include<stdlib.h> : #include<stdio.h> : #define row 4 : #define col 3 : void srh(int *a[][col], int *); : int main(void) : { : int a[row][col] = { { 26, 5, 7 }, { 10, 3, 47 }, { 6, 76, 8 }, { 40, 4, 32 } : }; 參考:http://www.programmer-club.com.tw/showSameTitleN/c/37881.html 底下有一些參考,建議可以先看底下 最大的問題可能是副程式參數設定 你乾脆int a[col][row]這樣也會過 但是這樣子在編譯器裡面又 等同於int a[][row];也可以是int (*a)[row]; 如果想要用指標的型態,傳送一個地址進去 型態可以選用(int**),這樣可以傳送多個地址進去 但要事先在main裡面把(陣列地址)一個一個放進去 我猜你的問號可能出在這裡 為什麼一維參數可以設(int*),二維卻不能 /********************************************************** Name : 副程式如何傳遞二維陣列 Date : 2016/05/26 By : CharlotteHonG Final: 2016/05/26 **********************************************************/ #include <stdlib.h> #include <stdio.h> #define row 3 #define col 2 void pri_arr(int** p1, int* p2){ printf("p1[0]=%d\n", p1[0][0]); printf("p1[0]=%d\n", p1[0][1]); printf("p1[0]=%d\n", p1[0][2]); printf("p1[1]=%d\n", p1[1][0]); printf("p1[1]=%d\n", p1[1][1]); printf("p1[1]=%d\n", p1[1][2]); /*可以試試看 */ // printf("p1[0][3]=%d\n", p1[0][3]); /*因為arr[col][row]是一起宣告的 所以記憶體位址是連續的, arr[0][0]的地址+4 等於 arr[1][0]*/ } /*=======================================================*/ int main(int argc, char const *argv[]){ int arr2[2]={}; /*======================================*/ int arr[col][row]={ {1,2,3}, {4,5,6} }; /*把他想像成 (刻意用不同變數名稱) int arr_1[row]={1,2,3}; int arr_2[row]={4,5,6}; 就是兩個陣列只是你濃縮一行一起宣告了 目的只是想要你想像成你宣告了2個陣列 兩個陣列分別有兩個地址對應 *(arr_1) 等於 arr_1[0] *(arr_1+1) 等於 arr_1[1]*/ /*======================================*/ int* ptr[2]; /*這個陣列可以放2個地址 ptr[0~1]*/ /*======================================*/ // 剛剛宣告兩個陣列,把他們的地址塞進去 ptr[0] = &arr[0][0]; // 等同於 ptr[0] = arr[0]; ptr[1] = &arr[1][0]; /* 因為有兩個地址所以我們個別放 你可以用for(i=0;i<col;i++)放 可以把它想像成(int i=0,*p=&i;) 只是現在是現在容器不一樣*/ /*======================================*/ pri_arr(ptr,arr2); /* 變數ptr放了(2個一維陣列地址)把她傳進去 ptr[0]指向[一個指標p(int*)] 指標p指向的記憶體位址有 1 這個數值 指標(p+1)指向的記憶體位址有 2這個數值*/ /*======================================*/ return 0; } /*=======================================================*/ /* 參考:http://www.programmer-club.com.tw/showSameTitleN/c/37881.html 地址 正確的翻譯應該是記憶體位置, 不過我個人覺得刻意用錯的(地址) 比較好敘述(短)與想像。 容器 可以把(int)想像成一個杯子這個杯子只能裝整數 (int)與(int*)是不同容器,為了好區別我自己是 不使用(int *p)而使用(int* p),這樣眼睛一看就 知道,這兩個容器(int)(int*)是不一樣的型態, 覺得這樣比較直接,比較好好思考。 *有一種時候我會放到變數前 (int i=0,*p=&i;) 兩種方式(int* p)(int *p)都是合法的且相等 指標 [int* 指標]可以放[一個地址] int* p = NULL; int a[2]={1,2}; a會等於&a[0],就是第一個整數的地址 p=a; or p=&a[0]; printf(%d, *(p+1)); //印出2 printf(%d, p[1]); //印出2 [int** 指標的指標]可以[放指標]的陣列 int* p[2]={地址,地址}; 可以讓這裡的地址個別指向不同的陣列 [int***] 疊層的概念,大同小異了 如果你要傳入好幾層副程式或許會用到 不過能化簡則化簡,比較好讀與思考 有誤歡迎告知(我會感謝你的XDD) */ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.35.139.127 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1464282013.A.4D8.html ※ 編輯: hunandy14 (114.35.139.127), 05/27/2016 01:06:49 ※ 編輯: hunandy14 (114.35.139.127), 05/27/2016 01:14:18 ※ 編輯: hunandy14 (114.35.139.127), 05/27/2016 01:16:13

05/27 02:02, , 1F
"二維陣列型態是(int**)而不是(int*)" 這句話很有問題.
05/27 02:02, 1F
ㄚㄚ表達有錯,我是想表達說二維陣列,函式參數可以用 (int**) 傳

05/27 02:05, , 2F
另int a[][row] 是等價於int (*a)[row],不是 int *a[row]
05/27 02:05, 2F

05/27 02:05, , 3F
這兩個意義差很大。
05/27 02:05, 3F
已修正,具體是差怎麼樣呢 ※ 編輯: hunandy14 (114.35.139.127), 05/27/2016 12:09:27

05/27 12:36, , 4F
int *a[row]是指標陣列
05/27 12:36, 4F

05/27 12:37, , 5F
int (*a)[row]是指向陣列的指標
05/27 12:37, 5F

05/27 12:55, , 6F
之後13誡再來補充好了....
05/27 12:55, 6F

05/27 14:50, , 7F
補充一下,陣列傳進函數會轉型成指標
05/27 14:50, 7F
※ 編輯: hunandy14 (120.117.72.133), 05/27/2016 17:33:13

05/27 17:36, , 8F
函數形參跟返回不能是陣列,但可以是陣列的指標
05/27 17:36, 8F

05/27 17:37, , 9F
c++的話還可以用陣列的參考
05/27 17:37, 9F
文章代碼(AID): #1NHokTJO (C_and_CPP)
文章代碼(AID): #1NHokTJO (C_and_CPP)