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