C语言3大难点:数组、指针、函数
数组
多个同种数据类型数据的集合,在内存空间上连续存储
基本形式:
<存储类型> <数据类型> <数组名>[元素个数]
存储类型:数组存储的方式
数据类型:存储的多个元素是什么数据类型,就写什么数据类型
数组名:和标识符的命名规则保持一致
是数组的首个元素的地址,代表了整个数组
元素个数:数组想要存放多少个元素,这里就写多少;写的是一个常量(普通整型常量:10,20,5;标识符常量:#denfine SIZE 20)
声明和定义:
int arr[5]; char buf[10];
初始化:
1、完全初始化
数组的每一个元素,都赋予一个初始值 例: int arr[5] = {0,1,2,3,4}; char buf[5] = {'h','e','l','l','o'};
2、部分初始化
数组的前面部分元素给予一个初值 例: int arr[5] = {0,1,2}; char buf[5] = {'w','o'}; 未被赋值的元素默认为0(字符数组默认为'\0') int arr[5] = {0};//全部为0 char buf[5] = {0};//全部为'\0'
3、未初始化
定义时未给元素赋初值 例: int arr[5]; char buf[5]; 数组中的元素为随机值
4、省略初始化
定义时未给定元素个数 例: int a[] = {1,2,3}; 初始化时给定多少个元素,系统就分配多大的空间
数组的使用:
通过数组名加下标的方式去访问
int a[5]; 该数组能访问到的元素:a[0] a[1] a[2] a[3] a[4] 若一个数组的元素个数为n 那该数组能访问到的下标为0~n-1 若访问a[5]则数组越界访问(非法访问内存),会产生段错误 定义数组时,下标表示元素个数 在使用数组时,下标表示的是第几个元素 注意:定义和使用时,下标的含义不一样
数组的遍历
#include <stdio.h>
int main(int argc, char *argv[])
{
int arr[5] = {0, 1, 2, 3, 4};
char buf[10];
int i = 0;
for( i = 0; i < 5; i++)
{
printf("arr[%d] = %d\n", i, arr[i]);
}
return 0;
}
结果: arr[0] = 0 arr[1] = 1 arr[2] = 2 arr[3] = 3 arr[4] = 4
练习:
定义一个整型数组,计算所有元素的和,并打印其中的最大值和最小值及其下标
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10] = {7,81,3,99,102,24,17,1,82,56};
int sum = 0;
int i = 0;
int max = a[0];
int min = a[0];
int max_i = 0;
int min_i = 0;
for( i = 0; i < 10; i++)
{
if( a[i] >= max)
{
max = a[i];
max_i = i;
}
if( a[i] <= min)
{
min = a[i];
min_i = i;
}
sum += a[i];
}
printf("sum:%d\n", sum);
printf("max:%d max_i:%d\n", max, max_i);
printf("min:%d min_i:%d\n", min, min_i);
return 0;
}
结果: sum:472 max:102 max_i:4 min:1 min_i:7
字符数组和字符串
字符数组可以用来存放字符串
char buf[6] = {'h','e','l','l','o'}; char buf[6] = "hello"; char buf[5] = {'h','e','l','l','o'}; char buf[5] = "hello"//数组越界访问 注意:用字符数组存放字符串时,一定要给'\0'预留空间
练习:从键盘上输入一个字符串,求该字符串的有效长度
#include <stdio.h>
int main(int argc, char *argv[])
{
char buf[10] = {0};
gets(buf);
int i = 0;
while(buf[i] != '\0')
{
i++;
}
/*
for(i = 0; i < 10; i++)
{
if( buf[i] == '\0')
{
printf("i:%d\n", i);
break;
}
}
*/
printf("i:%d\n", i);
return 0;
}
练习:从键盘上获取两个字符串,分别存放在两个数组里面,比较两个数组是否相同,若相同,输出0,若第一个比第二个大,则输出1,如果第一个比第二个小,则输出-1;
#include <stdio.h>
int main(int argc, char *argv[])
{
char a[10] = {0};
char b[10] = {0};
gets(a);
gets(b);
int i = 0;
for( i = 0; i < 10; i++)
{
if( a[i] > b[i])
{
printf("1\n");
break;
}
else if( a[i] < b[i])
{
printf("-1\n");
break;
}
else
{
if( 9 == i)
printf("0\n");
continue;
}
}
return 0;
}
数组的大小
sizeof(数组名):计算数组的字节大小 int arr[10] = {0}; sizeof(arr) == 40;(4*10)即 数据类型所占字节数*数组的元素个数 sizeof(数组名)/sizeof(数组的数据类型) -->元素个数 sizeof(数组名)/元素个数 -->数组的数据类型
字符串函数
1、strlen
头文件:#include <string.h> 函数原型:size_t strlen(const char *s); 作用:求字符串有效长度 例:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char buf[10] = {0};
int arr[10] = {0};
scanf("%s", buf);
printf("sizeof(buf):%ld\n", sizeof(buf));
printf("strlen:%ld\n", strlen(buf));
printf("siezof(arr):%ld\n", sizeof(arr));
return 0;
}
结果: asdf sizeof(buf):10 strlen:4 siezof(arr):40