一.字符串函数
strcpy函数
strcpy(用于字符串的拷贝,string copy)
char*strcpy(char* destination,const char*source);
传的都是指针类型的变量,拷贝被source指向的字符串,到destination指向的数组里面去,包含\0字符。
简而言之,把源指针指向的字符串拷贝到目标指针指向的空间里面去,返回目标空间的起始地址。
#include<stdio.h> #include<string.h> int main() { //字符串拷贝的时候 //hello bit char arr1[20] = { 0 }; char arr2[] = "hello world"; //把arr2中的字符串拷贝到arr1中 char* ret = strcpy(arr1, arr2); //数组名是数组首元素的起始地址,传的地址没问题。 //返回值存放在字符指针上,指针变量,即存放指针(地址)的变量 printf("%s\n", ret); return 0; }
图解:
memset函数
void*memset(void *ptr,int value,size_t num);(也可算字符,其ASCII码值也是整型,算出是整型或者本质上是整型都可以)
把ptr指向的内存空间的前num个字节的数据,设置成value的值。
#include<stdio.h> #include<string.h> int main() { char arr[20] = "hello world"; printf("%s\n", arr); memset(arr, 'x', 5); printf("%s\n", arr); return 0; }
图解:
二.函数的参数
实际参数(实参):
真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
传值调用:
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用:
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。(其实就是远程操控.)
例题:写一个函数可以交换两个整形变量的内容
//当函数调用的时候,实参传递给形参,这时形参是实参的一份 //临时拷贝,对形参的修改不影响实参。 void Swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 0; int b = 0; //输入 scanf("%d %d", &a, &b);//3 5 //交换 printf("交换前:a=%d b=%d\n", a, b); Swap(a, b); //输出 printf("交换后:a=%d b=%d\n", a, b); return 0; }
返回值为啥不变?
图解:
那么怎么可以让函数交换的时候,使得实参的值发生改变呢?
#include<stdio.h> void Swap2(int* pa, int* pb) { int tmp = *pa;//tmp = a; *pa = *pb; //a=b *pb = tmp; //b=tmp } int main() { int a = 0; int b = 0; //输入 scanf("%d %d", &a, &b);//3 5 //交换 printf("交换前:a=%d b=%d\n", a, b); Swap2(&a, &b); //输出 printf("交换后:a=%d b=%d\n", a, b); return 0; }
图解:
总结:指针即远程操控,*pa其实就是a,*pb其实就是b,做题时看成普通的变量交换更容易理解。