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

作者: hunandy14 (Charlott.HonG)   2016-05-27 01:00:08
※ 引述《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)
*/
作者: EdisonX (卡卡獸)   2016-05-27 02:02:00
"二維陣列型態是(int**)而不是(int*)" 這句話很有問題.另int a[][row] 是等價於int (*a)[row],不是 int *a[row]這兩個意義差很大。
作者: loveflames (咕啾咕啾魔法陣)   2016-05-27 12:36:00
int *a[row]是指標陣列int (*a)[row]是指向陣列的指標
作者: wtchen (沒有存在感的人)   2016-05-27 12:55:00
之後13誡再來補充好了....
作者: loveflames (咕啾咕啾魔法陣)   2016-05-27 14:50:00
補充一下,陣列傳進函數會轉型成指標函數形參跟返回不能是陣列,但可以是陣列的指標c++的話還可以用陣列的參考

Links booklink

Contact Us: admin [ a t ] ucptt.com