冒泡排序
每一轮排序都会将一个最大值摆到最终位置上
int a[5]={5,4,3,2,1};
5个数:比较4轮
第一轮:
45321
43521
43251
43215
第二轮:
34215
32415
32145
第三轮:
23145
21345
第四轮:
12345
代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
//冒泡排序
int a[] = {78,4,235,7,8,4,2,5,27,12,1}, temp;
int n = sizeof(a) / sizeof(int);
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 0; i < n; i++)
printf("%d\n", a[i]);
return 0;
}
选择排序
每一轮排序能将一个最小值摆到最终位置上
代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
//选择排序
int a[] = {23, 5, 2, 5, 8, 5, 3, 432};
int min, temp = 0;
int n = sizeof(a) / sizeof(int);
for (int i = 0; i < n - 1; i++)
{
min = i; //让最小值等于数组的第一个值
for (int j = i + 1; j < n; j++)
{
if (a[min] > a[j])
{
min = j; //找到最小值
}
}
if (min != i) //如果这一轮的第一个值不是最小值,执行下面的程序
{
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
for (int i = 0; i < n; i++) //输出
printf("%d\n", a[i]);
return 0;
}
二维数组
格式:存储类型 数据类型 数组名[行数][列数]
int a[2][3];
访问:
int a[2][3]={1,2,3,4,5,6};
printf("%d %d\n",a[0][0],a[1][2]); //索引从0开始
元素:
a[0][0] | a[0][1] | a[0][2] |
a[1][0] | a[1][1] | a[1][2] |
int a[2][3]={{1,2,3},{4,5,6}}; //按行进行赋值
int a[][3]={1,2,3,4,5,6}; //可以省略行数
int a[2][]={1,2,3,4,5,6}; //错误
行数 * 列数=元素个数
行数 * 列数 * sizeof(数据类型) = 空间大小
数组名也是二维数组首行地址
int a[2][3]={1,2,3,4,5,6};
printf("%p %p\n",a,&a[0][0]);
printf("%p %p\n",a+1,&a[1][0]);
a:第一行首地址
a+1:第二行首地址
初始化
- 全部初始化
int a[2][3]={1,2,3,4,5,6};
int a[2][3]={{1,2,3},{4,5,6}};
- 部分初始化 未初始化部分,值为0
int a[2][3]={1,2};
int a[2][3]={{1,2},{4}}; //按行赋值 1 2 0 4 0 0
int a[2][3]={};
- 未初始化 值为随机值
int a[2][3];
a[0][0]=9;
a[0][1]=5;
循环遍历
int a[2][3]={1,2,3,4,5,6};
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("%d\n",a[i][j]);
}
}
练习:求一个3*4的二维数组中最大值,及位置
#include <stdio.h>
int main(int argc, char const *argv[])
{
int max,m,n = 0;
int a[3][4] = {{5,2,7,43},{65,2,4,8},{2,764,25,2}};
max = a[0][0];
for (int i = 0;i<3;i++)
{
for (int j = 0;j<4;j++)
{
if(a[i][j]>max)
{
max = a[i][j];
m = i;
n = j;
}
}
}
printf("最大值为%d,位置在a[%d][%d]\n",max,m,n);
return 0;
}
1、若有以下说明语句:int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};char c=’a’,d,g;则数值为4的表达式是()。
A)a[g-c] B)a[4] C)a[‘d’-‘c’] D)a[‘d’-c]
2、假设int型变量占两个字节的存储单元,若有定义:int x[10]={0,2,4};则数组x在内存中所占字节数为()。
A)40 B)6 C)12 D)20
3、下列合法的数组定义是()。
A)int a[]=”string”; B)int a[5]={0,1,2,3,4,5};
C)char a=”string”; D)char a[]={0,1,2,3,4,5};
4、若给出定义:char x[]=”abcdefg”;char y[]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’};则正确的叙述为()。
A)数组x和数组y等价 B)数组x和数组y的长度相同
C)数组x的长度大于数组y的长度 D)数组y的长度大于数组x的长度
5、下列程序运行后的输出结果是()。
#include<stdio.h>
int main()
{
int n[3],t,j,k;
for(t=0;t<3;t++)
n[t]=0;
k=2;
for(t=0;t<k;t++)
for(j=0;j<3;j++)
n[j]=n[t]+1;
printf("%d\n",n[1]);
}
A)2 B)1 C)0 D)3
内存分配
int a[2][3]={1,2,3,4,5,6};
地址 | 元素 | |||
a[0] | a | &a[0][0] | 1 | a[0][0] |
a[0]+1 | &a[0][1] | 2 | a[0][1] | |
a[0]+2 | 3 | |||
a[1] | a+1 | 4 | ||
a[1]+1 | 5 | |||
6 |
int a[2][3]={1,2,3,4,5,6};
printf("%p %p %p\n", a[0], a, &a[0][0]);
printf("%p\n",a[0]+1);
a和a[0]打印的值一样,本质不同:
指针
本质:地址
一级指针
一级指针变量名:存储普通变量的地址
格式:存储类型 数据类型 *指针变量名
int *p
int a=5;
int *p=&a;
char b='q';
char *p1=&b;
访问:
int a=5;
int *p=&a;
printf("%d %d\n",a,*p);
printf("%p %p\n",p,&a);
指针操作符
*:取地址里边的内容
&:取地址符:取变量的地址
*&a:===a
&*a:错误
- 指针在使用前要先定义,同时初始化,未初始化的指针变量不能随便使用,会产生野指针
1)int a=5;
int *p=&a; //定义指针的同时,直接初始化
2)int *p=NULL; //先定义一个空指针,后边可以重新赋值
指针p指向变量a,*p可以访问到a的值,
可以通过*p间接修改变量a的值
- 把数组的首地址赋值给指针变量、
int a[5]={2,3,4,5,6};
int *p=a;
// int a[5]={2,3,4,5,6};
// int *p=a; === *p==2
char c[]="hello";
char *p=c; === *p=='h'
printf("%c\n",*p);
- 将指针变量里面保存的地址赋值给另一个指针变量
float a=1.3;
float *p = &a;
float *q = p; //float *q=&a;