目录
一维字符型数组做函数参数
形参 数组形式
实参 数组名
用函数实现gets功能
1 #include <stdio.h>
2
3 void Gets(char s[])
4 {
5 int i = 0;
6 while((s[i] = getchar())!='\n')
7 {
8 i++;
9 }
10 s[i] = '\0';
11
12 }
13
14 int main()
15 {
16 char s[100];
17 int i = 0;
18 Gets(s);
19
20 while(s[i]!='\0')
21 {
22 printf("%c",s[i]);
23 i++;
24 }
25 putchar('\n');
26 }
~
二维数组做函数参数
二维数组做参数
定义函数传参数时,两种都可以:
int sum (int (*a)[4],int row) 或者int sum(int a[ ][ 4 ],int row)
但是我们在main函数中引用时 ret = sum(a,row);传参时,只需要传递a就行,因为a代表首地址,实际编译器接收的是指针。
1 #include <stdio.h>
2
3 void printArray(int (*a)[4],int row)
4 {
5 int i = 0;
6 int j = 0;
7 for(i=0;i<row;i++)
8 {
9 for(j=0;j<4;j++)
10 {
11 printf("%3d",a[i][j]);
12 }
13 putchar('\n');
14 }
15
16 }
17
18 int main()
19 {
20 int a[][4] = {1,2,3,4,5,6,7,8,9,1,0,1,1,1,2,13};
21
22 int row = sizeof(a)/sizeof(a[0]);
23
24 printArray(a,row);
25 return 0;
26 }
二维字符型数组
做函数参数:与二维整型数组使用方式相同
注意:
1.不要和一维字符型数组传参数搞混;
使用练习:函数输入几个字符串,然后打印出来
1 #include <stdio.h>
2
3 void Inputstr(char s[][10],int row)
4 {
5 int i = 0;
6 for(i=0;i<row;i++)
7 {
8 gets(s[i]);
9 }
10 }
11
12 int main()
13 {
14 char s[5][10];//
15 int row = sizeof(s)/sizeof(s[0]);
16
17 Inputstr(s,row);
18 int i = 0;
19 for(i=0;i<row;i++)
20 {
21 puts(s[i]);
22 }
23
24 return 0;
25 }
练习:函数实现二维字符型数组排序
注意:字符串赋值和比较,需要用strcpy,strcmp;
#include <stdio.h>
#include <string.h>
void Inputstr(char s[][10],int row)
{
int i = 0;
for(i=0;i<row;i++)
{
gets(s[i]);
}
}
void InsertArray(char s[][10],int row)
{
int i,j;
char t[10];
for(i=1;i<row;i++)
{
strcpy(t,s[i]);
j = i;
while(j>0&&(strcmp(t,s[j-1])<0))
{
strcpy(s[j],s[j-1]);
j--;
}
strcpy(s[j],t);
}
}
int main()
{
char s[5][10];//
int row = sizeof(s)/sizeof(s[0]);
Inputstr(s,row);
int i = 0;
InsertArray(s,row);
for(i=0;i<row;i++)
{
puts(s[i]);
}
return 0;
}
数组做函数参数总结:
1.一维整型数组 做函数参数 -----int sum(int a[],int len)
形参 --- 数组形式 + 数组长度
实参 --- 数组名 + 数组长度
2.一维字符型数组 做函数参数-----int sun(char s[])
形参 --- 数组形式
实参 --- 数组名
原型: 一维字符型数组 主要用来存储字符串数据
3.二维整型数组 做函数参数------int sum(int s[][10],int row)
形参 --- 数组形式 + 行数 //本质 就是一维数组的长度
实参 --- 数组名 + 行数
4.二维字符型数组 做函数参数----int sum(char [ ][10],int row)
形参 --- 数组形式 + 行数 //本质 就是一维数组的长度
实参 --- 数组名 + 行数
标识符与作用域
标识符作用的范围 ---起作用的范围
空间上:
局部作用域
在花括号范围内的,都是局部作用域
全局作用域
不在任何一个花括号范围内
可见性:
就是程序运行到某句代码时,哪些表示符是可见(可以使用的)
标识符的可见性的规则:
1.先定义,后使用
2.同一作用域中,不能有同名标识符 //重复定义 (同一作用域:在同一个花括号内)
3.在不同的作用域,同名标识符,相互之间没有影响
4.如果是不同的作用域,
但是作用域之间存在"嵌套关系", 则内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符。(就近原则)
也就是说,不同层次的变量可以重名,且此时内层花括号的变量会屏蔽掉外层的同名变量,相当于被覆盖了·
C语言程序:
把内存划分了5个区域
栈 //主要 用来存放, 自动变量 或 函数调用的数据
堆 //空间大 堆上的空间 ,手动申请,手动释放
字符串常量区 // "hello" (只读)
静态区(全局区) // 全局变量 和 静态变量
代码区 // 只读的
程序 = 代码 + 数据
---------------------------------------------------------------
C语言的程序5个区
栈
堆 [数据区]
字符串常量区
全局区(静态区)
--------------------------------------
代码区 [代码区]
局部变量:
特点:局部变量空间 一般开在栈上。
如果不初始化,局部变量中的值是随机值(垃圾值)。
全局变量:
特点:全局变量空间 全局区。
如果不初始化,默认初始化为0。
时间角度:生命周期
int a;什么时候被开辟空间?执行到这条语句时,当它的作用域结束时,它也被销毁。
全局变量中 定义int a=100;int b=a;则会报错,全局变量不能确定谁先赋值。
--------------------------
全局变量 int a=200; int a ;不报错 int a = 200; int a= 300;报错,重复定义, 前面不报错是因为将第二个当成声明来看待,但是局部变量两种写法都报错,重复定义。
static修饰的变量,只能用常量初始化,直到整个程序结束 该变量才销毁。
register 修饰的变量,不能做&取地址 访问,它修饰的在寄存器内,不在内存内。
存储类别的关键字:
auto //表示它是一个自动变量 (局部变量) --- 自动申请 自动释放
static //static 修饰局部变量 此时 会被放在 全局区(静态区)
// 此时 局部变量的生命周期被延长
// 注意:
// 1.static 修饰局部变量 --只会被初始化一次
// 2.static 修饰的变量 -- 具有继承性
// 3.static 修饰的变量 -- 只能用常量初始化 (不能用变量初始化)
register // 寄存器
// 表示,把变量 存储 寄存器中
for (i = 0; i < 1亿; ++i)
{
}
//建议性
//register 修饰的变量 ,不能 做 & //(取地址)
extern //外部的 ---表示你的变量 是存在外部的 //多文件编程
//不在当前文件中
//只能 声明 全局变量
//static 修饰全局变量
//表示限定全局变量的作用域位本文件,别的文件不能通过extern来声明使用
//用途: 保护私有数据
// 防止被引用
修饰函数 //声明函数 在别处的定义的
static 修饰函数作用和修饰全局变量作用相同
限定作用域为本文件,别的文件不能通过extern来声明使用
static
变量
局部变量
表示将局部变量存放到静态区。
延长声明周期。
存在静态区的变量
a.不能用变量初始化
b.只会被初始化一次
c.反复使用该变量时,值具有继承性。
全局变量
限定作用域为本文件,别的文件不能通过extern来声明使用
函数
限定作用域为本文件,别的文件不能通过extern来声明使用