C语言基础学习(3)

本文详细介绍了C语言的基础知识,包括二维数组的定义和使用,字符数组的初始化与操作,如strcpy()和strcat()函数,以及函数的调用过程和参数传递方式。同时,讲解了auto、register、extern和static等关键字的作用,并简要提及了宏函数的优缺点。
摘要由CSDN通过智能技术生成

一、二维数组

  • 符号意义:
    int a[3][4] ;
    其中a为数组名,也是地址,表示首行地址,单位是一行;

  • &a表示数组地址,单位为一个数组;

  • &a[i][j]——取i行第j列元素的地址

  • a——数组首行地址,单位是行

  • &a——数组的地址,单位是数组

  • a[i]——数组第i行首元素的地址

  • &a[i]——数组第i行地址

二、字符数组

  • 定义字符数组:
    char a[5] = {‘h’,‘e’,‘l’,‘l’,‘o’};
    字符串:
    char b[15] = “helloworld”;

  • 初始化:
    char a[32] = {0};
    char b[32] = “helloworld”;
    char c[32] = “123456123”;

  • strcpy()函数:
    格式:strcpy(字符数组1,字符数组2)
    作用:将2中的复制到1中
    例:
    strcpy(a, b);//把b中的字符拷贝到数组a中
    strcpy(c,“helloworld”);

  • 连接函数strcat()
    格式:strcat(b,c);//把字符串c连接到b后面
    strcat(b,“11111”);

  • 字符串比较函数strcmp()
    strcmp(b, c);//b>c返回值大于0,b等于c返回值等于0,b<c返回值小于0.

#include <stdio.h>
#include <string.h>

int main()
{
	char a[32] = "helloworld";
	char b[32] ="125348";
	char c[32] = {0};

	strcpy(c, b);
	printf("%s\n", c);
	strcat(a, b);
	printf("%s\n", a);
	if (strcmp(a,b) > 0)			//如果a<b,函数返回值<0;若a=b,返回值=0;若a>b,返回值>0.
	{
		printf("a > b\n");
	}
	return 0;
}

三、函数

  • 函数类型void没有返回值
    如 void print()

  • 实参和形参个数相同,类型相同,顺序相同,名字不同

  • 函数调用步骤:
    (1)通过函数名找到函数入口地址
    (2)给形参分配空间(栈空间)
    (3)传参(值传递,地址传递)
    (4)执行函数体
    (5)返回
    (6)释放空间(栈空间)!!!!!

  • 当涉及到修改实参值的时候,需要传递地址

#include <stdio.h>

void swap(int *x, int *y);
int add(int x, int y)					//x,y为形参(形式参数)
{
	int sum;
	sum = x + y;
	return sum;
}

int main()
{
	//void swap(int *x, int *y);
	int a = 1, b = 2;
	int c;								//c是用来接返回值的
	printf("%d\n", add(a,b));			//a,b为实参(实际参数)
	
	printf("*************\n");			//	可以在printf中直接用add(a,b),也可以定义一个变量来承接返回值如下:
	c = add(a,b);						
	printf("%d\n", c);
	
	swap(&a, &b);					//涉及修改实参值时,要传递指针
	printf("%d %d\n", a, b);
	return 0;
}

void swap(int *x, int *y)
{
	int tmp;
	tmp = *x;
	*x = *y;
	*y = tmp;
}

  • 函数中的关键字:
    (1)auto
    (2)register 寄存器变量
    register int i; //寄存器变量,i存放在寄存器中
    循环次数比较多的循环变量,可以用register修饰
    注意:
    &取的是内存的地址,而寄存器变量寄存在寄存器中
    (3)extern(声明全局变量)
    例:extern int num; //声明外部变量,告诉编译器num在其他文件中被定义
    (4)static
    作用:1)修饰全局变量:改变变量的作用域,只能在本文件中被使用,不能在其他文件中使用;
    2)修饰函数:改变函数作用域,只能在本文件中被调用,不能在其他文件中调用
    3)修饰局部变量:改变变量的生命周期,知道整个程序结束才释放(存放的位置不一样,不加static修饰,存放在栈空间,加上修饰,存放在数据段(静态数据区))
#include <stdio.h>

void f()
{
	static int a = 0;		//改变变量的生命周期,直到整个程序结束才释放.
	//int a = 0;			不加static修饰结果为输出5个1.	
	a++;
	printf("%d\n", a);
}

int main()
{
	int i;
	for(i = 0; i < 5; i++)
	{
		f();
	}
	return 0;
}
  • 宏函数
    优点:(1)节约空间(不需要给形参分配空间)
    (2)执行效率高

    缺点:(1)编译效率低(第一步预处理需要替换)
    (2)不安全,只是简单的替换,没有语法检查

#include <stdio.h>
#define OUT		printf("helloworld\n")		//无参宏函数
#define	P(s)	printf("%s\n", s)			//有参宏函数
#define SQR(x)	(x) * (x)					//宏函数只是简单的替换,注意优先级
//#define SQR(x)  x * x				输出结果为 a+b*a+b,会先运算a*b在相加

int main()
{
	OUT;
	P("123456");
	int a = 1, b = 2;
	printf("%d\n", SQR(a + b));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值