一、二维数组
-
符号意义:
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;
}