函数
-
函数的基本语法格式
返回类型 函数名称(参数类型 参数){
函数主体
} -
值传递:函数定义的小括号内的参数称为形参,实际调用的参数为实参
-
数组作为函数参数:实际调用的时候只要写数组名。
在函数中对数组元素的修改就等同于对原数组元素的修改(这与普通的局部变量不同)
不过,虽然数组可以作为参数,却不允许作为返回类型出现。
练习
习题7-5 字符串逆序存放
题目描述 写一个函数将一个字符串按反序存放。在主函数中输入一个字符串,通过调用该函数,得到该字符串按反序存放后的字符串,并输出。 输入
一行字符串。 输出 输入字符串反序存放后的字符串。单独占一行。
#include <cstdio>
#include<cstring>
void k(char s1[], char s2[])
{
int n = strlen(s1);
for (int i = 0; i < n; i++)
{
s2[i]= s1[n-i-1] ;
}
}
int main()
{
char str1[100], str2[100] = {};
scanf("%s", str1);
k(str1, str2);
printf("%s",str2);
return 0;
}
习题7-7 复制字符串中的元音字母
题目描述
写一个函数,将一个字符串中的元音字母复制到另一个字符串中。在主函数中输入一个字符串,通过调用该函数,得到一个有该字符串中的元音字母组成的一个字符串,并输出。
输入 一个字符串(一行字符)。输出 该字符串所有元音字母构成的字符串。行尾换行。
- [x] 遇到问题
#include <cstdio>
#include<cstring>
void vowels(char s1[], char s2[])
{
int n = strlen(s1),j=0;
for (int i = 0; i < n; i++)
{
if ((s1[i] == 'a') || (s1[i] == 'e') || (s1[i] == 'i') || (s1[i] == 'o') || (s1[i] == 'u'))
{
s2[j] = s1[i];
j++;
}
}
}
int main()
{
char str1[100], str2[100];//*
scanf("%s", str1);
vowels(str1, str2);
printf("%s", str2);
return 0;
}
在主函数中没有初始化str2[100]={};的情况下,最终结果会输入乱码(正确的转换字符串后跟一堆“烫”)
解决办法:对str2进行初始化,但还是不知道要怎么解释这个问题。
指针
- 指针是一个unsigned类型的整数
- 指针变量用来存放指针,在某种数据类型后/前加*来表示这是一个指针变量
int *p;//C写法
int* p;//C++写法
int* p1, p2, p3;//只有p是指针变量
int *p1, *p2, *p3;//三个都是指针变量
- 其中,int* 是变量类型,后面的p才是变量名,因此地址是赋给p而不是*p
- & 取地址符 *取内容符
- 指针类型也可以作为函数参数的类型,这时视为把变量的地址传入函数,如果在函数中对这个地址中的元素进行改变,原先的数据就会确实地被改变,这种方式称为地址传递。
#include <cstdio>
#include<cstring>
void change(int* p) {
*p = 233;
}
int main()
{
int a = 1;
int* p = &a;
change(p);
printf("%d\n",a);
return 0;
}
这里使用*p修改地址中存放的数据,也就是改变了a本身,改变了a的值。
- 使用指针作为参数,交换两个数
#include <cstdio>
#include<cstring>
void swap(int* pa,int* pb) {
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
int main()
{
int a = 1, b = 2;
int* pa = &a;
int* pb = &b;
swap(pa, pb);
printf("a=%d,b=%d\n",a,b);
return 0;
}
- 引用不产生副本,只是给原变量起了一个别名
- [ ] 遇到问题:引用是什么东西?
练习
C语言10.1
题目描述
输入a和b两个整数,按先大后小的顺序输出a和b。注意请使用指针变量的方式进行比较和输出。输入 两个用空格隔开的整数a和b。
输出 按先大后小的顺序输出a和b,用空格隔开。 请注意行尾输出换行。
#include <cstdio>
#include<cstring>
void func(int* pa,int* pb) {
int temp;
if (*pa <= *pb)
{
temp = *pa;
*pa = *pb;
*pb = temp;
}
}
int main()
{
int a , b ;
scanf("%d %d", &a, &b);
int* pa = &a;
int* pb = &b;
func(pa, pb);
printf("%d %d\n",a,b);
return 0;
}
C语言10.2
题目描述 输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。
输入 三个用空格隔开的整数a、b和c。
输出 按先大后小的顺序输出a、b和c,用空格隔开。 请注意行尾输出换行。
#include <cstdio>
#include <cstring>
void change(int* p1, int* p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a , b,c ;
scanf("%d %d %d", &a, &b,&c);
int* pa = &a;
int* pb = &b;
int* pc = &c;
if (*pb < *pc) change(pb, pc);
if (*pa < *pb) change(pa, pb);
if (*pb < *pc) change(pb, pc);
printf("%d %d %d\n",a,b,c);
return 0;
}
C语言10.10
题目描述 给定字符串定义char *a = “I love China!”,读入整数n,
输出在进行了a = a +n这个赋值操作以后字符指针a对应的字符串。输入 一个整数n,保证0<=n<13.
输出 输出进行了题目描述中赋值操作之后a对应的字符串。 请注意行尾输出换行。
#include <cstdio>
#include <cstring>
int main()
{
char str[14] = "I love China!";
char* a = str;
int t;
scanf("%d", &t);
for (int i = t; i < 13; i++)
{
printf("%c", *(a + i));
}
return 0;
}
C语言10.15
题目描述 输入3个字符串,按从小到大的顺序输出。
要求使用指针的方法进行处理。
输入 3行,每行一个用字符串。保证每个字符串的长度不超过20。
输出 按从小到大的顺序输出这3个字符串,每个字符串一行。
请注意行尾输出换行。
- [ ] 遇到问题
#include "stdafx.h"
#include <cstdio>
#include <cstring>
void change(char* str1,char* str2)
{
char temp;
temp = *str1;
*str1 = *str2;
*str2 = temp;
}
int main()
{
char stra[10], strb[10], strc[10];
scanf("%s\n%s\n%s",stra,strb,strc);
char *a=stra, *b=strb, *c=strc;
if (strcmp(a, b) > 0) change(a, b);
if (strcmp(b, c) > 0) change(b, c);
if (strcmp(a, b) > 0) change(a, b);
printf("%s\n%s\n%s", stra, strb, strc);
return 0;
}
C语言10.16
题目描述
输入10个整数,将其中最小的数与第一个数对换,
把最大的数与最后一个数对换。要求用3个函数实现,
分别为输入10个数、进行处理、输出10个数。
要求使用指针的方法进行处理。
输入 用空格隔开的10个整数。
输出 输出进行题目描述操作之后的10个整数,每个整数之后输出一个空格。 请注意行尾输出换行。
#include <cstdio>
#include <cstring>
void input(int* a)
{
for (int i = 0; i <= 9; i++)
{
scanf("%d", a+i);//这里到底要不要取址
}
}
void change(int* a)
{
/**(a + 9)=999;*/
int *min,*max;
min =a; max = (a + 9);//这里之前写错了
for (int i = 0; i <= 9; i++)
{
if (*(a+i) <= *min) min = (a + i);
if (*(a + i) >= *max) max = (a + i);
}
int temp;
temp = *a;
*a = *min;
*min = temp;
temp = *(a+9);
*(a + 9) = *max;
*max = temp;
}
void output(int* a)
{
for (int i = 0; i <= 9; i++)
{
printf("%d ",*( a + i));//这里到底要不要取址
}
}
int main()
{
int a[10];
int *p = a;
input(p);
change(p);
output(p);
return 0;
}