函数(2)

目录

一维字符型数组做函数参数

二维数组做函数参数

二维字符型数组

数组做函数参数总结:

标识符与作用域

存储类别的关键字:


一维字符型数组做函数参数

形参   数组形式

实参   数组名

用函数实现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来声明使用            

  • 40
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值