Re: [问题] 函式里用(char *a[])的问题

楼主: kkkmode (kkk)   2014-04-22 23:23:10
※ 引述《wvwvwvwvwv (杀死丁力这个杂碎a~)》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: Visual C++ 2008
: 问题(Question):
: 把转换大小写的程式码写在主程式可以成功执行
: 一旦用了函式 就会失败
: 喂入的资料(Input):
: A B C 1 2 3 d e f
: 预期的正确结果(Expected Output):
: abcDEF
: 错误结果(Wrong Output):
: 程式码(Code):(请善用置底文网页, 记得排版)
: http://codepad.org/b0ELpY3D ←全写在主程式
: http://codepad.org/4r99xVBa ←用函式写 错误的
: 补充说明(Supplement):
: 有爬过至底13诫 是否是因为第4点的关系?
看过你的程式
你有一定基础,处于撞墙期
冲破后功力就是你的
1.首先,先看一下你的程式
&a和a都代表阵列起始位置,对于阵列加不加&都一样
把阵列当作参数传递,是传阵列的起始位置而非传整个阵列
此时函式的形参可以宣告成阵列或指标,实参也可以传入阵列或指标
在其他情况下指标不等于阵列
2.假如你坚持不改函式宣告,那程式要做以下修正:
i. main(void)加上: char *pa=a;
csie(&a,j)改成csie(&pa,j);
ii. csie(char *p[],int x)加上: char *s=*p; //形参*s[]改成*p[]
由于阵列在函式的形参会被转成指标,所以以下宣告也成立
csie(char **p,int x)
3.解释一下为何其他情况指标不等于阵列,先写以下3个档案编译:
**********v.h**********
#ifndef V_H_INCLUDED
#define V_H_INCLUDED
int i[];
#endif
**********v.c**********
#include "v.h"
int i[3]={1,2,3};
**********main.c**********
#include <stdio.h>
#include <stdlib.h>
int main()
{
extern int *i;
printf("i[1]=%d\n",i[1]);
return 0;
}
***************************
以上程式在执行时会fail,要把v.c改成如下才可顺利执行:
int i[3]={i,2,3}; //1改成i
原因是阵列取下标运算,是直接从阵列起始位置+下标值*型别size得到内存位置
再去此内存位置取值,只有一次memory access
而指标取下标,会把指标存的的值取出来,再加上下标值*型别size得到内存位置
再去此内存位置取值,两次memory access
这个例子是用来证明在一般宣告时阵列不等于指标
只有把阵列传入函式时,函式的形参可以宣告成阵列或指标
建议你可以看Expert C Programming(译名: C专家编程)
这本是1994年出的,但还是蛮有参考价值,可以去简体书店找看看
另外,建议练习C语言不要用visual studio
因为visual studio只支援C89,C99没有完整支援
目前最新标准是C11
作者: wvwvwvwvwv (杀死丁力这个杂碎a~)   2014-04-24 02:17:00
谢谢

Links booklink

Contact Us: admin [ a t ] ucptt.com