电商专业学习嵌入式软件开发第八天

  • C基础第三天

今天老师讲了数组和指针,单单是数组感觉难度不大,不难理解,但是和指针结合之后,对我来说难度就不止一点了,尤其是讲到最后,直接懵掉,感觉被绕晕了。老师先给我们讲解了昨天留的作业,又给我们出了几道题来巩固昨天的内容,然后才开始讲解数组和指针。

homework:猜拳小游戏
思路:
电脑: 石头(0) 剪刀(1) 布(2)
人: 石头(4) 剪刀(7) 布(10)
srand((unsigned)time(NULL))
a=rand()%3 0 1 2
人赢:5 || 9 || 10
电脑赢:6 || 7 || 11
else:平手

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
void main()
{
    char people;
    int computer,total;
    while(1)
    {
        sleep(3);
        system("clear");
        printf("\n这是一个猜拳游戏:\n");
        printf("A.石头\nB.剪刀\nC.布\nD.不玩了\n");
        scanf("%c%*c",&people);
        switch(people)
        {
            case 'A':
            case 'a':
                people=4;
                break;
            case 'B':
            case 'b':
                people=7;
                break;
            case 'C':
            case 'c':
                people=10;
                break;
            case 'D':
            case 'd':
                return;
            default:
                printf("输入有误,请重新输入");
        }
        srand((unsigned)time(NULL));
        computer=rand()%3;// 0 1 2
        switch(computer)
        {
            case 0:
                printf("电脑出了:石头!\n");
                break;
            case 1:
                printf("电脑出了:剪刀!\n");
                break;
            case 2:
                printf("电脑出了:布!\n");
        }
        total=people+computer;
        if(total==5 || total==9 || total==10)
        {
            printf("你赢了!\n");
        }
        else if(total==6 || total==7 || total==11)
        {
            printf("电脑赢了!\n");
        }
        else
        {
            printf("平手!\n");
        }
    }
}

练习:for 百钱买百鸡,公鸡 3/只 ,母鸡2/只 ,小鸡一块钱2只,问:实现一百块钱买一百只鸡。
思路:
公鸡:33
母鸡:50
小鸡:100-公-母

int g,m,x;
for(g=1;g<33;g++)
    for(m=1;m<50;m++)
    {
        x=100-g-m;
        if((g*3+m*2+x/2)==100 && x%2==0)
            printf("%d %d %d\n",g,m,x);
    }
数组:

定义数组: type typename[size];
例: int a[5]
定义了一个数组a,数组里面有5个元素,每个元素都是int 类型
访问数组中的每个元素:通过下标,
a[0]:第一个元素,
a[1]:第二个元素
....
a[n-1]; int a[n] ; 每个元素的下标号从0~n-1

特点:
1.各个元素在内存里面是紧紧相邻的。内存的最小单位是字节,一个字节一个地址。

  1. 能够通过下标号去快速访问数组里面的任何一个元素。

给数组赋值:
1.在定义的时候给它赋值(初始化)
例: int a[5]={1,2,3,4,5}
也可以不完全赋值
例: int a[5]={1,2,3} 这样,只会给数组里面的前3个元素赋值,后面没有赋到值的默认为0.

如果只定义了数组,但没有赋值,如果该数组是放在函数里面的,则该数组中的每个元素都是随机值。如果是放在函数外面的,则都是0。

int a[]={1,2,3,4,5}; 通过判断后面初始化元素的个数来确定数组的长度。

2.先定义,后赋值。
用过一个for循环来给一个数组赋值。
例: int a[n]
for(int i=0;i<n;i++)
a[i]=i;

注:1.对于数组,只能在定义它的时候通过初始化的方式整体访问它,其他任何时候都不能够整体访问一个数组,只能通过访问它的每一个元素去访问它。
2.在定义数组的时候,数组里面的元素的个数必须是个确定的值,不能是个变量。

练习:输出一个数组里面的最大值和最小值

#include <stdio.h>
void main()
{
    int a[10];
    for(int i=0;i<10;i++)
        scanf("%d",&a[i]);
    int max,min;
    max=a[0];
    min=a[0];
    for(int i=1;i<10;i++)
    {
        if(max<a[i])
            max=a[i];
        if(min>a[i])
            min=a[i];
    }
    printf("max:%d min:%d\n",max,min);
}

练习:输入10个数,保存在一个数组里,在数组中查找某个数,如果找到,就给出该数在数组中的位置,没有找到就输出“没有找到”。

#include <stdio.h>
void main()
{
    int a[10],search,flag=0;
    for(int i=0;i<10;i++)
        scanf("%d",&a[i]);
    printf("请输入要查找的值:");
    scanf("%d",&search);
    for(int i=0;i<10;i++)
    {
        if(search==a[i])
        {
            printf("找到了,位置是:%d\n",i+1);
            flag++;
        }
    }
    if(flag==0)
    {
        printf("没有找到!\n");
    }
}

练习:定义一个6个长度的数组,里面有序排好了5个数(升序),现在插入一个数,使插入之后的数组依然有序(升序)。

#include <stdio.h>
void main()
{
    int a[6],i,j,in;
    //输入有序的5个数
    for(i=0;i<5;i++)
        scanf("%d",&a[i]);
    printf("请输入要插入的数:");
    scanf("%d",&in);
    //确定插入的位置   =>i
    for(i=0;i<5;i++)
        if(a[i]>in)
            break;
    //把i后的数往后挪一个位置,空出i的位置
    for(j=5;j>i;j--)
        a[j]=a[j-1];
    //插入in到i
    a[i]=in;
    //输出整个数组
    for(i=0;i<6;i++)
        printf("%d",a[i]);
    printf("\n");
}
二维数组:

int a[2][3]
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]

定义一个二维数组: int a[行数][列数]; 每一个元素的下标号分为行坐标和列坐标,都是从0开始递增,

赋值
1.在定义的时候赋值(初始化)
a. int a[2][3]={1,2,3,4,5};
b. int a[2][3]={{1,2},{3,4,5}};

2.先定义再赋值。

#include <stdio.h>
void main()
{
    int a[2][3],i,j;
    for(i=0;i<2;i++)
    {
        for(j=0;j<3;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<2;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d",a[i][j]);
        }
    }
    printf("\n");
}

练习:输入3行4列的整型矩阵,输出最大值和对应的下标号

#include <stdio.h>
void main()
{
    int a[3][4]={{1,2,3,4},{5,6,12,8},{9,10,11,1}};
    int c,r,i,j,max=a[0][0];
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            if(max<a[i][j])
            {
                max=a[i][j];
                c=i;
                r=j;
            }
        }
    }
    printf("%d %d %d\n",max,c,r);
}

基本数据:
常量
变量
数据的存在形式:%d %f %c
怎么操作基本数据:顺序结构 , 条件结构, 循环结构。
数组:
一维数组:
数据的存在形式: 基本数据
怎么去操作数组:基本数据的操作过程
=>
二维数组:
一维数组的另一种形式
int a=1;
基本数据与指针的关系、

#include <stdio.h>
void main()
{
    int a=10;   
    *(&a)=20;      //& :获取a的地址  *:表示该地址里面的值
    printf("%d\n",a);
}

指针变量:定义一个变量用来接收一个地址。
例:定义一个变量,接收整型变量的地址
int a=10;
int *p=&a;
指针<=>地址

   定义一个变量,接收字符型变量的地址
   char c='a';
   char *p=&c;

一维数组与指针的关系
1.要明白指针不仅要知道它的值,还要知道它指向的对象
2.数组名表示该数组首元素的首地址,指向的对象是数组里面的元素。

#include <stdio.h>
void main()
{
    int a[7]={1,2,3,4,5,6,7};
    printf("%p %p %p\n",a,&a[0],&a);
    printf("%p %p %p\n",a+1,&a[0]+1,&a+1);
}

/*
a:表示数组的首元素的首地址,作为一个指针,指向的对象是数组里面的元素。+1,指针向后偏移一个所指对象的长度,一个元素,所以a+1,指向的是a[1].
&a:表示的是整个数组的地址,作为一个指针,指向的对象是整个数组.+1.指针向后偏移一个所指对象的长度,一个数组,所以,&a+1,指向数组结尾
*/
#include <stdio.h>
void main()
{
    int a[5]={1,2,3,4,5};
//  printf("%p %d\n",*(&a),**(&a));
//  int *p//p是一个指针变量,接收一个int型数据的地址,作为一个指针,指向的对象是一个int型数据
    int *p1=a;
    int *p2=(int *)&a;
    printf("%p %p\n",p1+1,p2+1);
}
// * :只有在定义一个变量的时候表示指针,其它任何时候都表示取地址里面的值。

下面的几个int定义只有写在代码框才能让星号正常显示

int p:定义了一个整型变量
int *p:定义了一个指向整型变量的指针,接收的是整型变量的地址
指针数组:指针的数组
int *p[5]:定义了一个含有5元素的数组,每个元素都是int *型,作为指针指向int 型的变量
数组指针:数组的指针
int (*p)[5]:定义了指针p。指向的是一个含有5个int型元素的数组

二维数组与指针的关系:

#include <stdio.h>
void main()
{
    int a[4][5]={1,2,3,4,5,
                       6,7,8,9,10,
                      11,12,13,14,15,
                      16,17,18,19,20};
    int (*p)[5]=a;  //a作为指针指向数组的首元素的首地址,二维数组的元素是一维数组,所以,a指向第一行,停在第一行的第一个元素处,1的位置。
    printf("a=%p a+1=%p\n",a,a+1);  //a+1指向这个数组的第二行,指针停在6的位置
    printf("*a=%p *(a+1)=%p\n",*a,*(a+1));//*a,作为一个指针,指向的是第一行里面的元素,停在1的位置,*a+1,作为指针,指向第一行的第二个元素,2, **a,就是取*a作为一个指针所指向的对象的值,即1.
    printf("&(*a+1)=%p &(*a+1)+1=%p\n",&(*a),&(*a)+1);
    printf("**(&(*a+1))=%d **(&(*a+1)+1)=%d\n",**(&(*a)),**(&(*a)+1));
    printf("*a+1=%p *(a+1)+1=%p\n",*a+1,*(a+1)+1);
    printf("**a=%d **(a+1)=%d\n",**a,**(a+1));
    printf("*(*a+1)=%d *(*(a+1)+1)=%d\n",*(*a+1),*(*(a+1)+1));
    printf("&a=%p &a+1=%p\n",&a,&a+1);
    int (*p1)[3]=(int (*)[3])a;
    printf("p1=%p p1+1=%p\n",p1,p1+1);
    printf("**p1=%d **(p1+1)=%d\n",**p1,**(p1+1));
}
/*
    1.一个指向行的指针前面加个*,就表示成指向列的指针。一个指向列的指针前面加个&就变成了指向行的指针。
    2.二维数组是按行存储,先存第一行,然后依次存下一行,它的元素是行,每个元素在内存中相邻存放。
*/

函数
函数与指针的关系
字符串

上面三点估计是老师想讲但是没来得及讲的,毕竟数组和指针放一起还是有点搞头的,只能让我们消化一下等到明天再讲了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容