数组:
int a[10]; 表示定义了一个整型数组,数组名为a,有10个元素。
a[0]——a[9],从低地址到高地址。
一维数组的初始化:
int a[4] = {0, 1, 2, 3};
也可以给部分赋值,只要对其中一个元素赋过值,其他未赋值的元素为0,如果都不赋值,则各元素的值为随机值。
数组的地址:
a 和 &a, a即是数组名也是地址
a 与 &a的值相同,意义不同
a是数组首元素的地址,&a是整个数组的地址,取第一个元素的地址作为整个地址。
sizeof(a) 求数组长度。
*(a[1] + 1), *(&a[1][1]), (*(a+1))[1]可以表示a[1][1]
例:冒泡排序法
#include <stdio.h>
#define SIZE 10
void maopao(int a[])
{
inti, j, tmp;
for(i = 0; i < SIZE; i++)
{
for(j = 0; j < SIZE – i - 1)
{
if(a[j] > a[j + 1])
{
tmp= a[j];
a[j]= a[j + 1];
a[j+ 1] = tmp;
}
}
}
}
int main()
{
inta[SIZE];
inti, j, tmp;
printf(“Pleaseinput:\n”);
for(i = 0; i < SIZE; i++)
{
scanf(“%d”,&a[i]);
}
maopao(a);
for(i = 0; i < SIZE; i++)
{
printf(“%d”, a[i]);
}
printf(“\n”)
return0;
}
二维数组的初始化
a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9,10, 11, 12}};
a, &a, a[0], *a的区别
a首行的地址
&a 数组的地址
a[0] 数组首行首元素的地址
*a 同a[0]
*与[]一个意思,a[0]等价于*(a+0), a[1]等价于*(a+1)
字符数组
char c[10];
求数组的元素个数: sizeof(a) / sizeof(a[0]
strlen():测试字符串长度的函数,函数的值为字符串中的实际长度(不包括’\0’)
scanf():只能获取空格前面的字符
strcat():将两个char类型连接
strcpy():会把’\0’也给复制过去
strncpy(str, ptr, 5):指定复制的字节数
strcpy的两个参数是两个地址
strcmp(str, ptr):比较两个字符串,结果有>0, =0, <0;
str1 = “HHH”; 不合法
str1 = str2; 不合法
例:在字符数组中指定位置插入字符
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//第一种方法
/*int main()
{
charstr[20] = {0};
charch;
intnum, i, length;
printf("Pleaseinput :\n");
scanf("%s%d%c", str, &num, &ch);
if(num>= 20)
{
printf("ERROR");
exit(1);
}
length= strlen(str);
for(i = 0; i < length - num + 1; i++)
{
str[length- i] = str[length - 1 - i];
}
str[num- 1] = ch;
printf("%s\n",str);
return0;
}*/
//第二种方法
int main()
{
charstr[20] = {0};
charptr[20] = {0};
charch;
intnum, i, length;
printf("Pleaseinput:\n");
scanf("%s%d%c", str, &num, &ch);
if(num>= 20)
{
printf("ERROR");
exit(1);
}
strncpy(ptr,str, num -1);
ptr[num- 1] = ch;
//strncat(ptr,&ch, 1);
strcpy(ptr+ num, str + num -1);
printf("%s\n",ptr);
return0;
}
函数
C程序:只包含一个主函数main(),也可以包含一个主函数和若干个其他函数(库函数和自定义函数)
函数类型 函数名(形式参数类型说明表)
{
声明部分
执行部分
}
形参实参名字可以不一样,但个数于类型必须一致。
函数名是一个地址。
函数调用的步骤:
1、 通过函数名找到函数的入口地址
2、 给形参分配空间(与实参的空间地址无关)
3、 传值(实参 >> 形参)【分为值传递和地址传递】
4、 执行函数体
5、 返回(return)到main函数
6、 释放空间(释放的是栈空间)
c语言空间分为:
数据段:存放全局变量,被static修饰的静态变量
代码段:存放代码及常量
栈空间:局部变量;程序运行后全部释放
堆空间:
register 寄存器变量
尽量在大量频繁操作时使用寄存器变量,且声明变量个数应尽量少。
寄存器变量没有地址
extern声明外部变量,编译时需提供c文件
gcc 1.c 2.c -o 1
只有全局变量能被extern 声明
static修饰全局变量,改变该变量作用域,仅能在本文件中使用。
static 修饰函数,改变函数作用域,仅能在本文件中使用
static修饰局部变量:改变变量的生命周期,直到程序结束才被释放
main()函数在今后的编写中应该尽量简洁,多调用函数,而不是在main中使用函数。
预处理
预处理命令种类
宏定义 #define
文件包含 #include
条件编译 #if--#else--#endif
语句结尾不加分号
#include <>:去系统指定的目录中找(库)
#include ””:当前目录下(自定义)