C语言_二维数组与一维指针

知识点1:字符串 字符串:本身属于字符数组、字符串结尾有’\0’。
1.1 字符串作业 1. 从键盘上输入一串字符串,计算字符串里的空格、大写字母、小写字母、数字个数
2. 字符串比较:从键盘上录入2个字符串,判断是否相等。
#include
int main()
{
   char str1[100];
   char str2[100];
   int i=0;
   /*1.  录入数据*/
   printf(输入字符串1:);
   scanf(%s,str1);
   printf(输入字符串2:);
   scanf(%s,str2);
   /*2.  比较字符串*/
   while(str1[i]!='\0'||str2[i]!='\0')
   {
       if(str1[i]!=str2[i])break;
       i++;
   }
   if(str1[i]=='\0'&&str2[i]=='\0')
   {
       printf(字符串相等.\n);
   }
   else
   {
       printf(字符串不相等.\n);
   }
   return 0;
}
3. 字符串删除:从键盘上录入一个字符串,删除字符串里指定的单词,输出结果。
   比如:原字符串”akjbcds123dfjvbf123fdvbfd123”
   删除单词:“123”
   输出的结果:”akjbcdsdfjvbffdvbfd”
#include
#include
int main()
{
   char str1[100];
   char str2[100];
   int i=0,j=0;
   int str2_len=0;
   /*1.  录入数据*/
   printf(输入源字符串:);
   scanf(%s,str1);
   printf(输入要删除的字符串:);
   scanf(%s,str2);
   /*2.  计算要删除字符串的长度*/
   str2_len=strlen(str2);
/*3.  查找字符串*/
   for(i=0;str1[i]!='\0';i++)
   {
       //比较字符串
       for(j=0;str2[j]!='\0';j++)
       {
          if(str1[i+j]!=str2[j])break;
       }
       if(str2[j]=='\0')
       {
          //4.  删除字符串---后面向前面覆盖
          for(j=i;str1[j]!='\0';j++)
          {
              str1[j]=str1[j+str2_len];
          }
          str1[j]='\0';
          i--;
       }
   }
   //5.  输出结果
   printf(str1=%s\n,str1);
   return 0;
}
4. 字符串查找:从键盘上录入一个字符串,查找字符串里有几个特定的单词。再输出结果。
  比如:原字符串”akjbcds123dfjvbf123fdvbfd123”
   查找的单词:“123”
输出结果:3
5. 字符串排序:从键盘上录入一个字符串,按照小到大的顺序排序。
#include
#include
int main()
{
   char str1[100];
   int len=0;
   int i,j;
   int tmp;
   printf(输入要排序的字符串:);
   scanf(%s,str1);
   len=strlen(str1);
   //开始排序
   for(i=0;i;i++)
   {
       for(j=0;j;j++)
       {
          if(str1[j]>str1[j+1])
          {
              tmp=str1[j];
              str1[j]=str1[j+1];
              str1[j+1]=tmp;
          }
       }
   }
   printf(排序之后的字符串:%s\n,str1);
   return 0;
}
6. 字符串的插入:从键盘上录入一个字符串,从指定位置插入一个字符串,再输出结果。
   比如:原字符串“1234567890”
(1). 从指定位置插入新的单词。 比如 从第2个下标插入一个“abc”字符串。
结果: “123abc4567890”
#include
#include
int main()
{
   char str1[100];
   char str2[100];
   int addr=0;
   int str1_len;
   int str2_len;
   int i;
   /*1.  录入数据*/
   printf(录入源字符串:);
   scanf(%s,str1);
   printf(录入要插入的字符串:);
   scanf(%s,str2);
   printf(输入要插入的下标位置:);
   scanf(%d,&addr);
   str1_len=strlen(str1); //3
   str2_len=strlen(str2); //2
/*2.  完成插入*/
   //完成数据移动
   for(i=str1_len-1;i>=addr;i--)
   {
       str1[i+str2_len]=str1[i];
   }
   //数据替换
   for(i=0;i;i++)
   {
       str1[i+addr]=str2[i];
   }
   str1[str1_len+str2_len]='\0';
   /*3.  输出数据*/
   printf(str1=%s\n,str1);
   return 0;
}
(2). 从指定单词后面插入新的单词。 比如 从”123”这个单词后插入一个“abc”字符串。
结果: “123abc4567890”
7. 字符串替换: 从键盘上录入一个字符串,将指定单词替换成想要的单词。
   比如:原字符串“123jfvfdj123dkfvbfdvdf”
   想要将“123”替换成“888”或者“8888”或者“88”
#include
#include
int main()
{
   char str1[100];
   char str2[100];
   char str3[100];
   int str1_len=0;
   int str2_len=0;
   int str3_len=0;
   int i,j;
   int cnt=0;
   /*1.准备数据*/
   printf(输入源字符串:);
   scanf(%s,str1);
   printf(输入查找的字符串:);
   scanf(%s,str2);
   printf(输入替换的字符串:);
   scanf(%s,str3);
   /*2.  计算长度*/
   str1_len=strlen(str1);
   str2_len=strlen(str2);
   str3_len=strlen(str3);
   /*3.  字符串替换*/
   for(i=0;i;i++)
   {
       //查找字符串
       for(j=0;j;j++)
       {
          if(str1[i+j]!=str2[j])break;
       }
       //如果查找成功就进行替换
       if(j==str2_len)
       {
          //总长度变短了
          if(str2_len>str3_len)
          {
              cnt=str2_len-str3_len; //差值
              //完成数据向前移动--覆盖
              for(j=i+str2_len-cnt;j;j++)
              {
                 str1[j]=str1[j+cnt];
              }
              str1[str1_len-cnt]='\0';
          }
          //总长度变长了
          else if(str2_len)
          {
              cnt=str3_len-str2_len; //差值
              //完成数据向后移动
              for(j=str1_len;j>=i+str2_len;j--)
              {
                 str1[j+cnt]=str1[j];
              }
              str1[str1_len+cnt]='\0';
          }
          //替换
          for(j=0;j;j++)
          {
              str1[i+j]=str3[j];
          }
          //重新计算长度
          str1_len=strlen(str1);
       }
   }
   /*4.  完成字符串打印*/
   printf(str1=%s\n,str1);
   return 0;
}
8. 从键盘上输入一个整数:将整数转为字符串输出。
  比如:int a; scanf(“%d”,&a); 使用字符串形式打印出a的值。
#include
#include
int main()
{
   char str[100];
   char str1[100];
   int data=0;
   int j=0,i=0;
   printf(从键盘上输入整数:);
   scanf(%d,&data);
   // 123 -->'1' '2' '3'
   while(data)
   {
       str[i++]=data%10+'0';
       data=data/10;
   }
   for(j=0;j;j++)
   {
       str1[j]=str[i-j-1];
   }
   str1[j]='\0';
   printf(str1=%s\n,str1);
   return 0;
}
9. 从键盘上输入一个字符串,转为整数输出。
#include
#include
int main()
{
   //123
   char str[100];
   int data=0;
   int i=0;
   printf(从键盘上输入字符串:);
   scanf(%s,str);
   while(str[i]!='\0')
   {
       data*=10;//data=0 data=10 data=120
       data+=str[i]-'0';//data=1 data=12 data=123
       i++;
   }
   printf(data=%d\n,data);
   return 0;
}
10. 回文字符串。 “121”,“1221”
11. 将第8题和第9题转成浮点数。
12. 将10进制数据转为16进制输出。 比如: 3  --->0x3
13. 将10进制数据转为二进制输出。
知识点2:字符串到整数-浮点数的格式化转换 //输出的都是字符串
#include
int printf(const char *format, ...); 
int fprintf(file *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...); //格式化转换函数
int snprintf(char *str, size_t size, const char *format, ...);
#include
#include
int main()
{
    char str[100];
    sprintf(str,%s%s%s%d%c%f,123,456,789,666,'a',123.456);
    printf(str=%s\n,str);
    return 0;
}
//输入的是字符串
#include
int scanf(const char *format, ...);
int fscanf(file *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
#include
#include
int main()
{
    float a;
    char str[]=123.456;
    sscanf(str,%f,&a); //123
    printf(a=%f\n,a);
    return 0;
}
//字符串转整数
#include
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
long long atoq(const char *nptr);
知识点3:多维数组 一维数组和二维数组使用频率较高。
一维数组:  定义的时候只有一个下标。 char buff[100];
二维数组:  定义的时候只有二个下标。 char buff[10][100];
二维数组可以看成一个矩阵。char buff[行][列];
3.1 二维数组特点: 二维数组定义的时候,如果赋了初始值,行可以省略掉,列不可用省略。 int main()
{
    char data1[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    char data2[3][3]=
    {
       {1,2,3},
       {4,5,6},
       {7,8,9}
    };
    //第1个[]指定有多少个一维数组,第2个指定1维数组有多大
    char data3[][5]=
    {
       1,2,3,
       4,5,6,
       7,8,9
    };
    return 0;
}
3.2. 二维数组如何访问成员? #include
#include
int main()
{
   char data[3][3]=
   {
       {1,2,3},
       {4,5,6},
       {7,8,9}
   };
   printf(第1行的第2列:%d\n,data[1][2]);
char str[][100]={123,456,789,中国,嵌入式};
   printf(%s\n,str[3]);// str[3]== char str[]=中国;
   return 0;
}
3.3 作业 定义一个int类型的二维数组,比如:[400][400],从键盘上向这个二维数组录入数据,计算二维数组交叉数据之和。  ---计算矩阵交叉—对角线数据的和。
#include
#include
int main()
{
    int data[4][4];
    int i,j;
    //从键盘上录入数据
    for(i=0;i<4;i++)
    {
       for(j=0;j<4;j++)
       {
           scanf(%d,&data[i][j]);
       }
    }
    return 0;
}
知识点4:一行代码上字符串太长该如何定义? #include
#include
int main()
{
    //第一种方法:
    char str1[]=1234567890123456789012 \
    34567890123456789012345678901234567 \
    89012345678901234567890123456789012 \
    345678901234567890;
    //第二种方法:
    char str2[]=1234567890
    123456789012345678901234
    567890123456789012345678
    9012345678901234567890;
    printf(str1=%s\n,str1);
    printf(str2=%s\n,str2);
    return 0;
}
知识点5:一维指针 5.1 指针的概念 指针就是地址。c语言里指针可以直接访问地址,计算机的cpu、外设硬件都是依靠地址操作的。
指针变量如何定义?
#include
#include
int main()
{
    char *p1;   //定义一个char类型的指针变量
    int *p2;    //定义一个int类型的指针变量
    //int类型的指针变量: 存放地址数据。
int data=123; //定义一个int类型的变量
    //int类型的变量: 存储整数数据。
    return 0;
}
指针如何使用?
#include
#include
int main()
{
    // &data  取地址    a&b 按位与   a&&b  并且
    // int *p 定义一个int类型的指针
    // *p   取出指针指向空间中的数据--取数据
    // a*b a和b乘法
int *p; //指针变量本身就是存放地址的
    int data=123; 
    //p=data; //错误:data本身只是一个变量标识符,不是地址
    p=&data;  //将data的地址赋值给指针p
printf(*p=%d\n,*p); //取出指针p指向空间中的数据
    *p=666; //给指针指向的空间赋值
    printf(data=%d\n,data);
    return 0;
}
什么是野指针?
野指针就是本身没有合法地址空间---非法指针。
野指针会导致的常见错误:段错误。
下面代码就会导致段错误:
#include
#include
int main()
{
    int *p;//指针只能存放地址
    *p=123;
    printf(*p=%d\n,*p);
    return 0;
}
指针本身占的空间是多少?
所有指针类型都占4个字节空间。和类型没有关系。
#include
#include
int main()
{
    int *int_p;//指针只能存放地址
    int int_a;
    char *char_p;//指针只能存放地址
    char char_a;
    float *float_p;//指针只能存放地址
    float float_a;
    double *double_p;//指针只能存放地址
    double double_a;
    printf(int_a=%d\n,sizeof(int_a));//4
    printf(int_p=%d\n,sizeof(int_p));//4
printf(char_a=%d\n,sizeof(char_a));
    printf(char_p=%d\n,sizeof(char_p));
printf(float_a=%d\n,sizeof(float_a));
    printf(float_p=%d\n,sizeof(float_p));
printf(double_a=%d\n,sizeof(double_a));
    printf(double_p=%d\n,sizeof(double_p));
    return 0;
}
5.2 指针访问数组成员 访问一维数组成员的方式有哪些?
#include
#include
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,0};
    int *p;
    p=a;
    printf(下标4的值:%d\n,a[4]); //5
    printf(下标4的值:%d\n,*(a+4)); //5
    printf(下标4的值:%d\n,*(p+4)); //5
    return 0;
}
指针访问一维数据常用的操作方式:字符串
#include
#include
int main()
{
    char str[]=1234567890;
    char *p=str;
    int len=0;
    printf(p=%s,str=%s\n,p,str);
    //计算字符串的长度
    while(*p++!='\0')
    {
       len++;
    }
    printf(len=%d\n,len);
    return 0;
}
指针自增和自减?++和—运算符
#include
#include
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,0};
    int *p=a;
    printf(%d\n,*p);   //1
    printf(%d\n,*p++); //1
    printf(%d\n,*p);   //2
    printf(%d\n,*(p+3));//5
    printf(%d\n,*p);//2
    printf(%d\n,*(++p));//3
    printf(%d\n,*p);//3
    printf(%d\n,*p--);//3
    printf(%d\n,*p);//2
    return 0;
}
指针自增自减偏移字节是多少? 与指针本身的类型有关系。
#include
#include
int main()
{
    /*
    int a[]={1,2,3,4,5,6,7,8,9,0};
    int *p=a;
    printf(偏移之前的地址:p=%#x\n,p);
    *(p++);
    printf(%d\n,*p);   //2
    printf(偏移之后的地址:p=%#x\n,p);
    */
    char a[]={1,2,3,4,5,6,7,8,9,0};
    char *p=a;
    printf(偏移之前的地址:p=%#x\n,p);
    *(p++);
    printf(%d\n,*p);   //2
    printf(偏移之后的地址:p=%#x\n,p);
    return 0;
}
数组本身可以当做指针使用吗?不可以
指针特点: 自增、自减、可以改变指向。
#include
#include
int main()
{
    int a[]={1,2,3,4,5}; //*(a+3)
    int b[]={11,12,13,14,15};
    //下面3行代码是错误的
    a--;
    a++;
    a=b;
    return 0;
}
指针可以当做数组使用吗? 可以
数组特点: 可以通过下标访问数组成员。
#include
#include
int main()
{
    int a[]={1,2,3,4,5};
    int *p=a;
    printf(%d\n,a[0]);
    printf(%d\n,p[0]); //*p
    return 0;
}
5.3 数组指针 数组指针可以指向一个一维数组,行指针也叫一维数组指针。
定义语法:  char (*p)[5]; 该指针指向一个二维数组里的一个一维数组地址,一维数组的成员是5个字节。
二维数组的定义方法: char a[10][5];
#include
#include
int main()
{
    int (*p)[5]; //定义一个一维数组指针---行指针
    int a[2][5]=
    {
       {1,2,3,4,5},
       {6,7,8,9,10}
    };
    p=a; //将a地址给p指针
    printf(%d\n,p[0][2]);
p++; //加一个一维数组的大小
    printf(%d\n,p[0][2]);
    return 0;
}
5.4 指针数组 指针数组:  表示该数组成员可以存放指针。
指针数组定义语法:int *p[5]; 表示定义一个int数组,该数组的类型可以存放5个int类型的指针变量(地址)。
#include
#include
int main()
{
    int a,b,c;
    int *p[3]; //一次定义3个int类型的指针变量
    //存放地址
    p[0]=&a;
    p[1]=&b;
    p[2]=&c;
    //对空间赋值
    *p[0]=123;
    *p[1]=456;
    *p[2]=789;
    //取出数据
    printf(%d\n,*p[0]);
    printf(%d\n,*p[1]);
    printf(%d\n,*p[2]);
    return 0;
}
#include
#include
int main()
{
    char a[][100]={小明,小白,小李};
    char *p[]={小明,小白,小李};
printf(%s\n,a[0]);
    printf(%s\n,p[0]);
    return 0;
}
5.5 字符串查找函数 #include
char *strstr(const char *源字符串, const char *要查找的字符串);
函数功能: 就是在源字符串里查找指定的字符串,查找到之后就返回该字符串的地址。
#include
#include
int main()
{
    char str[]=123abc4567890;
    char *p;
    p=strstr(str,abc);
    printf(%s\n,p);
    return 0;
}
5.6 指针类型常见的初始化值:null #include
#include
int main()
{
    char *p=null; // (void*)0 == null
    printf(%#x\n,p);
    if(p!=null)
    {
       //判断指针是否可以使用
    }
    return 0;
}
5.7 作业:字符串解析 1. 练习上午学习的新知识。
2. 解析gps的数据。gps芯片接收到卫星的信号之后,会通过字符串的形式将解析的数据输出。
#include
#include
int main()
{
    char gps_data[]=
    {
        $gngga,114955.000,2842.4158,n,11549.5439,e,1,05,3.8,54.8,m,0.0,m,,*4f
       $gngll,2842.4158,n,11549.5439,e,114955.000,a,a*4d
       $gpgsa,a,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37
       $bdgsa,a,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2a
       $gpgsv,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7b
       $gpgsv,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7c
       $gpgsv,3,3,10,31,50,287,36,32,66,018,*7f
       $bdgsv,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62
        $gnrmc,114955.000,a,2842.4158,n,11549.5439,e,0.00,44.25,061117,,,a*4d
       $gnvtg,44.25,t,,m,0.00,n,0.00,k,a*14
       $gnzda,114955.000,06,11,2017,00,00*47
       $gptxt,01,01,01,antenna ok*35
    };
    return 0;
}


全球半导体厂商20强联发科登上冠军宝座
双绕组电流互感器的设计及应用
上海+商汤:共同推进智慧城市在上海的发展
ATX-3000线束测试仪:汽车线束线缆故障及线缆测试仪应用
【4月20日|上海】三年磨一剑!是德科技华东区首场B5G新技术与测试方案研讨会
C语言_二维数组与一维指针
【节能学院】防火门监控系统在某住宅项目上的应用
让人工智能模型获得人类的联想能力
苹果今晨发布iOS10.2 Beta5版本:新增72个emoji表情
可信赖的银联宝5v1A电源IC U65113E
ROCCAT屡获殊荣的键盘系列再添新宠:MAGMA和PYRO RGB游戏键盘
三星将于5月3日在欧洲15个国家推出Galaxy Fold
台积电拟1034.8亿元新台币扩充产能 全力冲刺7纳米制程拉大竞争对手差距
如何用电阻法巧判压电陶瓷片质量
iPhone没有诞生前,手机王者是它,携诺基亚6代重返颠覆路!
如何为DC-DC选择适合的电感和电容
iphone8什么时候上市?iphone8竟然支持AR?
基于HSR/PRP冗余协议为现代列车配备安全可靠的通信网络
电路语义工具将硬IP转换为可合成模型
穿越电缆因产品质量问题被给予暂停电缆中标资格2个月
s