函数基本用法
- 举例:两数求和
#include <stdio.h> int sum(int, int);// 函数的声明,函数的原型 int main(int argc, char const *argv[]) { int m = 10; int n = 20; int s; s = sum(m,n); printf("%d\n", s); } int sum(int a, int b){ int sum; sum = a + b; return sum; }
函数的参数/传递
- 全局变量:即函数体外说明的变量,它们在程序中的每个函数里都是可见的。(不建议使用)
- 复制传递方式:调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参初始化。形参是新开辟的存储空间,因此,在函数中改变形参的值,不会影响到实参。
- 地址传递方式:按地址传递,实参为变量的地址,而形参为同类型的指针。被调用函数中对形参的操作,将直接改变实参的值(被调用函数对指针的目标操作,相当于对实参本身的操作)。
编写一个删除字符串中空格的函数
void del_space(char *p);
int main(int argc, char *argv[])
{
char a[] = " abd dd ";
puts(a);
del_space(a);
puts(a);
return 0;
}
void del_space(char *p){
char *q;
q = p;
while(*p){
if(*p==' '){
p++;
}else{
*q = *p;
p++;
q++;
}
*q= '\0';
}
}
指针函数使用举例
- 错误演示
- 局部变量运行在栈内存中,函数运行结束就回收内存
- 野指针概念:指针变量中的值是非法的内存地址
char * getstring(); int main(int argc, char *argv[]) { char * r; r = getstring(); printf("%p\n",r); printf("---%s---\n", getstring()); puts(r); return 0; } char * getstring() { // char str[20];// 错误写法(野指针),局部变量运行在栈内存中。函数结束就内存就回收了。 // char str[20] = "welcome"; // 错误写法,同上。字符数组,可以修改。 static char str[20]; // 正确 // char * str = "welcome"; // 字符串常量,正确,但是不能修改。 strcpy(str, "hello"); printf("%p\n",str); return str; } // 运行结果 // 0xbfab5fc8 // 0xbfab5fc8 // 0xbfab5fc8 // ---`����V���l�ԅ�_��---
- 将输入的int类型的数字转换为字符串输出
- 数组名就是地址
char * itoa(char *p, int n); int main(int argc, char *argv[]) { int n; char s[50], * r; printf("input:"); scanf("%d", &n); itoa(s, n); puts(s); return 0; } char * itoa(char *p, int n) { int r, i = 0, j; while (n) { r = n % 10; n /= 10; p[i] = r + '0'; i++; } p[i] = '\0'; j = i-1; i = 0; while (i < j) { r = p[i]; p[i] = p[j]; p[j] = r; i++; j--; } return p;// 数组名就是地址 }
- 数组名就是地址