一、数组和指针作为参数向函数传递值的特点
数组出现在一个表达式中时,将数组作为参数传递给函数时和将指针的第一个元素的指针传递给函数是完全等价的。但是数组作为传递工具可以采用值传递和地址传递两种方式,前者需要完整复制数组,但是安全性较好;后者的速度较快。
二、数组和指针并不是完全相同
只有数组作为参数传递时,两者是相等的。用char a[MAX]定义时将分配MAX这个字符的内存空间;但是若定义语句是char *a时,分配的内存空间可能只有2个或4个字符。会造成很严重的后果,因此不可这样做。
三、关于一段程序的理解
int a0[MAX] int *a1=a0-1; a0[0]和a1[1]是相同的,并且a0[MAX-1]和a0[MAX]是相同的。所以可以实现像一个数组一样引导另一个数组的所有元素;但是要注意以下几点:这方法其实行不通,因为&a0[0]可能不是一个有效的地址;其次这种方法不具有一般性,别人读你的程序会产生障碍,自己隔段时间看有可能也是看不懂。
四、指针和带下标的数组名访问元素
for(i=0;i<MAX;++i)
{x=a[i];}
for(p=a;p<&a[MAX];++p)
{
x=*p;
}
实现的功能是一样的,两种方式的初始情况和递增情况是相同的,作为循环表达式的比较表达式也是相同的,但是x的引用却不同。间接引用快,但是乘法运算比较慢。
五、array_name和&array_name有什么不同
第一个定义的是指向数组的第一个元素的指针,后面一个是指向整个数组的指针。
六、字符串和数组有什么不同
数组的元素可以是任意一种类型,字符串是一种特别的数组。c语言是将字符串看做了一个字符数组,以NULL字符结束。数组的值和数组中第一个元素的地址是相同的,通常一个c语言字符串和一个字符指针是等价的。
七、函数的定义和声明
函数体的结构如下:
类型标识符 函数名(形式参数表列)
{
声明部分
语句
}
对于函数的定义,从类型标识符到声明部分都要有。但是声明只需要有前三行即可。也就是说声明不一定要实现什么功能。
八、函数传递过程中的问题
函数的实参要求有确定的值,在调用的时候给形参分配相应的内存单元,同时将实参的值赋给形参。因为是复制,因而在操作过程中不会影响到实参的内容。
列举了可以作为形参的数据:
简单变量或数组元素;指针变量或数组名;数组名;结构体数组。
九、编写有多个返回值的C语言函数
利用全局变量,利用传递数组指针,传递结构体指针来完成多个返回值的c语言函数。
十、实现printf的方法
#include<stdio.h>
int printf(char * format , ...)
{va_list ap ;
va_start(ap, format);
int n =vprintf(format,ap)
va_end(ap)
return n;
}