C语言基础知识(四)

冒泡排序

每一轮排序都会将一个最大值摆到最终位置上

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);

aa[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;

  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值