函数和数组都是一段连续的空间,不过函数具备三要素
函数调用实参传给形参,是值拷贝的过程,如果是指针,拷贝的是地址
值拷贝是上层调用者保护自己的空间不被修改的能力
指针是变量标识的唯一身份证
地址传递是上层调用者让下层函数修改自己空间的办法
scanf("%d",a);//a传递的不是地址,所以a不会被改变,需要写成scanf("%d",&a)
struct abc buf;
func(struct abc buf){};//结构体作为函数参数传递,在工程中基本不使用,因为太浪费内存空间,而是使用结构体指针
const char *p;//只读空间,为了让该空间只是看一看
char *p;//表明该空间可能被修改
操作一段空间的步骤:1.知道起始地址;2.判断结束标志;如果是字符空间,判断是否是0结束;如果不是字符空间,判断是否超过长度
模板:
int func(char *p)
{
while(*p)
{
}
}
以下是strlen的代码
int strlen(const char *p)
{
int i = 0;
if(p == NULL)
{
return -1;
}
while(p[i])
{
i++;
}
return i;
}
效率最高的strlen代码跟具体的cpu有关,可能有的cpu内置的汇编指令支持strlen,就不需要我们写的c语言strlen代码了
void *是数据空间(非字符空间)的标识符
printf("%s",buf);//如果buf的内容是“00hello”,那么读到第1个字符是0,就认为结束了,所以printf的结果是什么也没有
数据(非字符)拷贝模板:
int func(int *dest,void *src,int len);
int func(void *buf,int len){
int i = 0;
unsigned char *tmp= (unsigned char *)buf;
while(i<len){
tmp[i];
i++;
}
]
空间的修改,参数统一用void *,如果只是单一变量,例如int short long等,参数用int *,short *,long *