目录
一维数组
定义和引用及初始化
#include <stdio.h>
#define N 3
int main()
{
int a = 0,b = 0,c = 0;
int grp1[N]; //数组的个数只能是常量,也就是说不能直接用int,float类型的变量来定义个数,当然也可以直接写正整数;
int grp2[3];
int grp3[3] = {1,2,3}; //数组内可以初始化<=数组个数的数据,数据个数不足数组元素最大个数时,系统自动补0
int grp4[3] = {1,2}; //等价于grp4 = {1,2,0};
//grp1,grp2初始化
grp1[N] = {1,2,3};
grp2[0] = 1;
grp2[1] = 2;
grp2[2] = 3;
//一维数组的引用
a = grp4[0];b = grp4[1];c = grp4[2]; //分别引用数组grp4中的第1,2,3个元素
//同时,数组中的元素存放的地址连续,grp4[0]是数组中的第一个元素,同时,该元素的地址也是该数组的地址
printf("grp4[0] = %d\n*grp4 = %d\n" , grp4[0] , *grp4);
printf("grp4[1] = %d\n*(grp4+1) = %d\n" , grp4[1] , *(grp4+1));
//以上两个输出内容一致
//新学习的同学特别注意数组的第一个元素是从下标0开始
return 0;
}
举个栗子
第一个例子是冒泡法排序,我使用了指针做函数参数来进行求解,因为昨天复习了一下指针,所以顺便拿来练练手
冒泡法虽然时间复杂度是O(n^2),但是这玩意挺多地方要用到的,也是容易理解的一个排序方法,所以初学的同学可以多看看课本里引用的例题,课本上好懂一点
#include <stdio.h>
void sort(int* ,int);
void sort(int *p , int num)
{
//小->大
int i = 0 ,j = 0, temp = 0;
for(;i < (num - 1);i++)
{
for(j = 0;j < num - 1 - i;j++)
{
if(*(p+j+1) < *(p+j))
{
temp = *(p+j+1);
*(p+j+1) = *(p+j);
*(p+j) = temp;
}
}
}
}
int main()
{
//冒泡法排序
int arr[10] ,i;
printf("Please Enter 10 Numbers:\n");
for(i = 0;i < 10 ;i++)
{
/*scanf("%d",&arr[i]);*/
scanf("%d",arr+i);
}
sort(arr , 10);
for(i = 0;i < 10;i++)
{
printf("%d " , arr[i]);
}
return 0;
}
这是运行结果
二维数组
定义引用和初始化
#include <stdio.h>
int main()
{
//二维数组
int arr1[3][4]; //可以认为这是定义了一个3*4的矩阵,也可以看成是由3个数组大小为4的数组构成的一个新的数组
//同一维数组,二维数组的元素内存也是连续的
//arr1[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 这样定义是有问题的,因为此时编译器认为你要做的是给第四行第五列这个元素赋值,然而这个范围已经越界(3*4)了
int arr2[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
//当要一次性初始化全部元素时,可以写成 int arr2[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
return 0;
}
举个栗子
将二维数组以矩阵形式打印(直观,打印图形的话也美观点)
#include <stdio.h>
int main()
{
int arr[3][4] = {{52,23,78,54},{87,12,91,67},{96,45,93,35}};
int i = 0,j = 0;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
printf("%d\t",arr[i][j]);
}
printf("\n");
}
return 0;
}
打擂台算法求最大值
数组里的哪个数最大就是大Boss
#include <stdio.h>
int main()
{
int arr[3][4] = {{52,23,78,54},{87,12,91,67},{96,45,93,35}};
int h = 0,l = 0, max = 0;
int i = 0,j = 0;
max = arr[0][0];
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
if(arr[i][j] > max)
{
max = arr[i][j];
h = i;
l = j;
}
}
}
printf("max = %d\nhang = %d\nlie = %d" ,max,h+1,l+1);
return 0;
}
字符数组
C语言里面没有字符串类型的数据,所以字符串一般存放在字符数组中
//因为这个例子比较难敲,我就不敲定义引用和初始化了,书上讲的很详细
要注意的点就是'\0'
当定义的字符数用双引号定义时,系统自动在最后一个位置加字符串结束标志'\0'
比如char chr1[] = {"I am handsome!"};共有14个字符,实际上这个数组的大小为15
相比较char chr2 = {'I',' ','a','m',' ','h','a','n','d','s','o','m','e','!'};chr2数组大小为14
输入输出
scanf("%s",str); //注意这里是数组名,不用取址符号&(其实str本身就是一个地址,数组第一个元素的地址)
//吐槽一下当时学数组时老师讲到指针我以为是钟表上面转的指针(好sb啊当时)
printf("%s",str); //注意·这里也是使用的数组名,而不是引用的单个数组元素
//printf() 输出直到遇见'\0结束'
引用string.h头文件输入输出字符数组以及字符串处理
puts(str);
gets(str);
strcat(str1,str2); //将两个字符串连接
strlen(str); //计算字符串个数,不包含'\0'
strcmp(str1,str2); //判断两个字符串是否相等,相等的话返回值为0
//如果不相等,则根据第一个不同的字符的ASCII码值大小选择输出是正数或是负数(str1 - str2)
应用:输入一串字符串,统计其中有多少个单词
这个题目不能想当然,我没有加入word这个变量,而是直接利用空格来判断字符,其实当连续输入两个空格时,并没有两个单词,所以需要word这个变量来判断是否有无单词
#include <stdio.h>
int main()
{
char str[50] = {0};
int i , num = 0 , word = 0;
printf("Please Enter A string:");
gets(str);
for(i = 0;str[i] != '\0';i++)
{
if(str[i] == ' ')
word = 0;
else if(word == 0)
{
num++;
word = 1;
}
}
printf("%d words\n" , num);
return 0;
}
运行结果