前言:地址的概念
1》地址 -- &
int a;
scanf(“%d”,&a);
2》我想知道 a 到底放在哪个地址中,想把地址打印出来
地址对应的格式控制符:%p
#include <stdio.h>
int main()
{
int a=10;
scanf(“%d”,&a);
printf(“%d”,a);//打印的是 a 的值
printf(“%p”,&a);//打印的是 a 的地址
return 0;
}
2、sizeof ---求数据类型大小的关键字,求数据类型大小,单位字节
sizeof(数据类型);
sizeof(变量名);不是函数,是运算符
一、数组
1.1 数组的概念
数组是相同数据类型的集合
1.2 数组的特点:
1》存放相同类型的若干个元素(数组中存放的数据,叫做元素)
2》数组名是数组的首地址,也是数组首元素地址 (在用scanf输入时,后边只用写数组名,不用加&)
3》数组中各元素地址空间连续
类型表达:数据类型 变量名[长度]; (数据类型:基本数据类型 char int float double等)
(长度:数组中存放元素的个数,必须是常量)
数组的大小=元素数据类型大小*长度; 长度=元素个数 = 数组的大小/元素数据类型大小
例:int a[10];
数组的数据类型:int [10]; (去掉变量名,剩下的就是数据类型)
数组的变量名:a
元素的数据类型:int
数组的大小:4*10
1.3 数组的使用:
数组取成员:索引法
1.4 数组的初始化
① 完全初始化:int num[6] = {1,2,3,4,5,6};
② 部分初始化:int num[6] = {1,2,3}; //依次赋值,没有初始化的元素,系统给0
常见:int num[6] = {0}; //第一个是我赋值给的0,剩下的是系统给0
③ 不初始化:int num[6]; 全局变量:系统给0;
局部变量:系统给随机数;
注意:数组除了定义的时候,可以整体赋值,其他时候必须要取元素赋值。
④ 省略数组长度 -- 遵循完全初始化
int num[] = {0,1,2,3,8,9,2};
for(i=0;i<sizeof(num)/sizeof(num[0]);i++)
1.5 数组的简单应用:冒泡排序
方法:从第一个数开始,与他后面的数作比较,较小的往后排,较小者再与后边的作比较
int num[6] = {1,3,2,6,7,8};
1 3 2 6 7 8
3 1 2 6 7 8
3 2 1 6 7 8
3 2 6 1 7 8
3 2 6 7 1 8 第一轮,6个数,比较5次
3 2 6 7 8 1
3 2 6 7 8 1
3 6 2 7 8 1
3 6 7 2 8 1 第二轮,比较4次
3 6 7 8 2 1
6 3 7 8 2 1
6 7 3 8 2 1 第三轮,比较3次
6 7 8 3 2 1
7 6 8 3 2 1 第四轮,比较2次
7 8 6 3 2 1 第五轮,比较1次
8 7 6 3 2 1
有n个数比较:比较 n-1 轮,第 i 轮,比较:n-i 次
循环嵌套:外层循环控制次数,内层循环取元素依次比较。
二、字符数组
2.1 字符数组初始化
char buf[20]; //基本方法和上面的一维数组没有任何区别,但是,有一些特殊用法,如下:
部分初始化:char buf[20] = {‘h’,’e’,’l’,’l’,’o’}; //部分初始化,没赋值的部分,系统给0(数值0或者’\0’)
定义一个字符数组:char buf[20] = {"hello"}; 等价于 char buf[20] = {'h','e','l','l','o','\0'};
char str1[]={‘h’,’e’,’l’,’l’,’0’}; sizeof(str1) = 5;
char str2[] = {“hello”}; sizeof(str2) = 6; “hello” == ‘h’,’e’,’l’,’l’,’0’,’\0’
%s -- 字符串
char buf[20];
输出:遇到 ‘\0’ 停止输出
输入:scanf(“%s”,buf);
对于scanf来说,空格和回车表示输入完成;要想输入空格,要引入gets函数;
2.2 gets() puts() getchar() putchar()
1》gets():
函数用法:gets(数组名);
函数功能:从键盘获取一个字符串,放在数组中,遇到回车表示输入完成
2》puts():
函数用法:puts(数组名);
函数功能:向屏幕上打印,遇到 ’\0’ 停止打印(会自带一个换行)
补充:和单字符相关的两个函数(和数组没有关系)
3》getchar():从键盘获取单个字符
格式:char ch;
ch = getchar();
4》putchar():向屏幕打印一个字符
putchar(变量名);
示例:
printf(“%s”,ch);
字符串的格式控制符 -- %s -- 遇到‘\0’,停止输出
字符串的输入:
scanf:遇到回车或者空格,就结束
gets函数:只有遇到回车停止输入!
(puts函数:输出到屏幕上)
怎样学习一个函数:
man 1 :指令 man 1 ls;
man 2:系统相关的函数
man 3:C语言标标准库函数
三、和字符串相关的函数
1》求字符串中字符个数 -- strlen
头文件:#include <string.h>
函数原型:size_t strlen(数组名); // size_t 是 int 的别名
函数功能:求字符个数,遇到 \0 停止计算
返回值:字符个数,类型为 int 类型
用法:int len = strlen(数组名);
如:a = strlen(buf);
注意:和sizeof要区分开!!
用法:sizeof求数据类型大小;strlen求字符串长度
char str[50]=”hello world!”;
Int len1 = sizeof(sizeof(str)); //50
Int len2 = strlen(str); //12
2》字符串拷贝函数 strcpy
函数头文件:#include <string.h>
函数原型: strcpy(数组名1, 数组名2);
函数功能:将数组2中的内容拷贝到数组1中,连同\0一块拷贝,\0之后的不再复制。
使用时需要注意的问题是数组名1的空间一定要大于等于数组名2的所占用的空间。否则,会出现严重的程序问题,重要数据可能被破坏等一系列后果。还有一点,要保证数组名2要有字符串结束标记符('\0'),否则可能会出现越界操作。
3》字符串的拼接 strcat
函数头文件:#include <string.h>
函数原型: strcat(数组名1, 数组名2);
函数功能:将数组2中的内容,连接到数组1 的后边;
strcat()在目的串连接之前,先会对dest进行检索'\0',如果成功检索到'\0',则从dest第一个'\0'的位置开始用src中的第一个字符代替,以此类出,直到拷贝完src中的所有字符,并在dest的最后加上一个结束标记符('\0'),dest没有结束标记符('\0'),则可能会导致一个非常严重的问题,即出现数组溢出(越界访问)的问题,轻则数据出现不稳定,重则程序无法执行,甚至出现一系列系统问题.
4》字符串的比较 strcmp
函数头文件:#include <string.h>
函数原型:int strcmp(const char *s1, const char *s2);
形参:s1--数组名 s2--数组名
返回值:int类型
函数功能:比较是按相应的元素,依次比较(s1-s2)
s1>s2:返回大于0的数
s1<s2:返回小于0的数
s1=s2返回值为0
直到出现不同的字符或遇'\0'为止。
总结:
printf,scanf,getchar,putchar;gets;puts;--<stdio.h>
strlen,strcpy,strcat,strcmp; -- <string.h>
五、二维数组
5.1 数组的特点:
- 存放相同类型的若干个元素!
- 数组名是数组的首地址,也是数组首元素地址(数组名就是一个地址!)
- 数组中元素地址空间连续
定义一个二维数组:数据类型 变量名[行长度][列长度]
例:int num[3][4]; //定义了一个3行4列的数组
二维数组num的元素:num[0],num[1],num[2];
只是num[0]仍然是一个数组,元素有:int num[0][0],int num[0][1],int num[0][2],int num[0][3]
同样:num[1]也是一个数组,元素有:int num[1][0],int num[1][1],int num[1][2],int num[1][3]
num[2]也是一个数组,元素有:int num[2][0],int num[2][1],int num[2][2],int num[2][3]
二维数组的含义:二维数组的本质是一维数组,只是数组元素仍然是一个数组!
5.2 数组初始化
1》完全初始化
int num[3][4] = {{1,2,3,4},{8,9,4,5},{4,6,7,8}};
int num[3][4] = {1,2,3,4,8,9,4,5,4,6,7,8};
2》部分初始化
int num[3][4] = {{1,2},{8,9},{4,6}};
二维数组的输入输出:
3》省略长度初始化 -- 列长度不能省略
int num[][2] = {1,2,3,4,8,9,4,5,4,6,7,8};
字符串数组:(字符串=字符数组)
char buf[3][80];
for(i=0;i<3;i++)
{
gets(buf[i]);
//scanf(“%s”,buf[i]);
//二维数组的每一个元素是一位数组
}