函数与指针
1函数的概念
函数:具有特定功能的程序段,C语言程序是有函数来组成的
定义函数的目的:将一段特定的功能封装起来,为了方便使用
定义函数的规则:单一性(为了代码的可扩展性)
例如:
左移,右移,上移,下移,开炮
把功能都写在main函数的弊端
1.重复代码特别多,又长又臭
2.如果功能发生变化,会修改很多地方
函数的基本格式:
返回值类型函数名字(形参列表)
{
函数体;
功能代码;
}
#include <stdio.h>
/左移的功能
int left()
{ // 左移
printf("方向盘向左移\n");
}
int main()
{
left(); //调用函数
return0;
}
1. 函数的使用
函数的基本格式:
返回值类型函数名字(形参列表)
{
函数体;
功能代码;
}
定义函数有三个确定:
1.确定函数名称
//根据函数的功能来确定,见文知意
//规范:26个字母,数字,下划线组成
//不能以数字开头
2.确定形参列表
//(形参类型行参名称),根据用户调用函数的时候,是否需要传入一些补助的值来确定的
3.确定返回值类型
//根据函数执行完,是否需要返回给函数的调用者
定义函数的时候,写在函数名后面这个小括号里面的变量,称为形式参数,简称形参
形参也是变量
注意点:1.形参名称不能重复 2.函数体里面不能定义和形参名称一样的变量
实参:实际参数。调用函数的时候,传入的参数,称为实参
注意点:形参和实参没关系的。在函数里面改变形参的值,不会影响外面实参的值
基本数据类型作为形参传递的时候,是值传递
*/
#include <stdio.h>
int getSum(int v1,int v2)
{
int sum;//定义一个变量sum来保存和
sum= v1 + v2;
return sum;//需要把求的和告诉调用者
// return的作用:
// 1.结束函数 2.返回值给调用者
}
int getAverage(int a,int b)
{
// int a;
a =100;
int average = (a + b)/2;
return average;
}
int main(int argc,constchar *argv[])
{
// argc:系统传递进来的参数的个数
// argv:参数的实际内容
printf("argc = %d\n", argc);
printf("argv = %s\n", argv[0]);
printf("argv = %s\n", argv[1]);
int result = getSum(10, 20);
int result = getAverage(20, 40);//20 40是我们的实参
int num1 = 10;
int num2 = 30;
int result = getAverage(num1, num2);调用函数,计算平均值
printf("num1 = %d\n", num1);
// printf("result = %d\n", result)
return0;//程序正常结束就可以
}
2指针
1. 指针的基本概念
//基本数据类型作为函数参数传递的时候,是值传递
//要想在函数内部改变一个函数外部的值,需要传递一个地址
/*
&取地址符
&num取得num的地址(地址就是一个16进制的数字,类似门牌号)
* int* p;
1.当声明变量的时候,*没有任何意义,只是表示声明的这个变量是一个指针变量
2.当指针变量声明完了,再对指针变量前面取*,就代表要访问指针变量存储的地址所在的那块内存空间
*干了两件事:
2.1.通过pointer里面保存的地址,找到它指向的这一块内存空间
2.2.取出这块内存空间里面的值
*/
#include <stdio.h>
void change(int * number)//number = &val;
{
*number =10;
}
int main(int argc,constchar * argv[])
{
int val =55;
printf("val = %d\n", val);
change(&val);//&取地址符ffc1
printf("val = %d\n", val);
int num;
num =10;
printf("num = %d\n", num);
num =55;
int * p;
p = #//p里面存的是num的地址
printf("*p = %d\n", *p); //*p 就相当于num
*p =66;
/*
如果要传递一个地址,我们需要用一个指针变量来接收
基本数据类型的时候,怎么样来声明一个变量
数据类型变量名
int num;
声明一个指针变量:
数据类型 *指针变量名
int * pointer;
指针也是一个数据类型,指针使用来保存地址
注意:指针占用8个字节
*/
/*
int num; //num用来保存整型数据
num = 10;
// 0000 0000 0000 0000 0000 0000 0000 1010
int * pointer;//指针是用来保存地址
//把地址这个数值ffc13转换成2进制
pointer = # //取得num的地址,然后赋值给pointer
//一个指针如果保存了一个变量的地址,我们就说这个指针指向这个变量
// 指针就是一个地址簿,只能保存一个地址
printf("num = %d\n", num);
*pointer = 55;
// *干了两件事:
// 1.通过pointer里面保存的地址,找到它指向的这一块内存空间
// 2.取出这块内存空间里面的值
// printf("num = %d\n", num);
// num = 55;
printf("num = %d\n", num);
*/
return0;
}
2. 指针与字符串
1.
// char name[4] = "lty";
30;//常量
"hello";//字符串常量
char b = 'a';
char *c = &b;//把变量b的地址取出来,赋值给c(c是一个指针变量)
char name1[] = {'l', 't', 'y', '\0'};
char name2[] = "lty";
// printf("%p\n", name2);
"lty";//一个数组,这个数组的名字就是 "lty"
// printf("%p\n", "lty");
// printf("%p\n", &"lty"[0]);
//字符串的特点 \0
char *name = "lty";//把字符数组的首地址赋值给了一个指针变量
char name4[] = "lty";
// printf("name4 = %s\n", name4);
printf("name = %s\n", name);
name4[1]= 'M';
// printf("name4 = %s\n", name4);
// name[1] = 'M';
printf("name = %s\n", name);
// 数组保存的字符串是可变的字符串,放在栈里
// char*保存的,是不可变,放在常量区
*/
2.
// 总结一下
// 定义字符串的方式
// 1.利用数组
// char name[10] = "lee";
// 特点:里面的内容是可以更改的
// 应用场景:当字符串的内容需要经常修改的时候,用数组来保存
// 2.利用指针
// 特点:里面的内容不能更改,一旦赋值,就不能更改
// char *name = "lee";
// 应用场景:可以优化内存,当字符串不需要经常修改的时候
// 需要999个字符串这999个字符串都是一样的