通俗易懂C语言---知识补充

这一节主要写一些比较零散的知识,一边写,一边复习,如有问题,欢迎指正

 字符串

在C语言中,是没有字符串类型的,那么怎么去定义这个字符串呢

char str[]="hello anthony";
char *str="hello anthony";
char str[14]="hello anthony";
char str[4]={'a','b','c','\0'};

基本上就上面几种形式,关于数组,大家都知道元素个数可以少于数组大小,但是不能多于数组大小,所以str[14]实际大小可以是大于14的数,但不能小于14,小于14属于内存越界,因为字符串"hello anthony"是以'\0'结尾,它也占用一个空间,假如不以'\0'结尾呢

看一下这个代码

#include <stdio.h>
 
void main(){
   char str[50];
   int i;
   char *string="fhdfhsjdhfkhsdkfhkjshdjkfhsdkfhjkshdkjfhskdfhkshdkjfhjskdfhkjshfkhskjfhskjhfkjshfkj";
   for(i=0;i<49;i++){
        str[i]=string[i];
   }
   printf("%s\n",str);
}

字符串没有初始化,并且给到str[i]的也没有'\0',那么最终会输出一个什么呢:

fhdfhsjdhfkhsdkfhkjshdjkfhsdkfhjkshdkjfhskdfhkshd烫蘰

最后会出现乱码,以上就是字符串的一些注意事项

sizeof()和strlen()

对于字符串来说,怎么去知道它的长度,如果你需要把\0包括在内,就用sizeof,如果不想包括,就用strlen()。

递归函数

一个函数在它的函数体内调用它自身称为递归函数

一个简单的例子:

long factorial(int n){
   if(n==0 || n==1){
    return 1;
 }else{
   return factorial(n-1)*n;
   }
}

main......

联合

联合的定义和结构体是一样的,不同的在于结构体的每个成员地址是不一样的,而联合的所有成员都是从同一个地址开始的,也就是说,牵一发而动全身。

联合只有一个初始化器,看下结构体初始化定义:

struct TIME time={1,2,2021};

那么联合呢,联合体变量中的成员是共用一个首地址,共占同一段内存空间,所以在任意时刻只能存放其中一个成员的值。所以,在对联合体类型的变量定义并初始化时,只能对 1 个成员赋初值,初值需要用 “{}” 括起来。

#include <stdio.h>
int main()
{
    union ucode   /*定义联合体类型*/
    {
        char u1;
        int u2;
    };
    union ucode a;   /*定义联合体类型的变量*/
    a.u2=5;
    printf("输入a.u1的值:\n");  /*提示信息*/
    scanf("%d",&a.u1);
    printf("输出数据:\n");
    printf("%c\n",a.u1);   /*提示信息*/
    printf("%d\n",a.u2);
}

输出结果:

输入a.u1的值:
65
输出数据:
A
65
  • 第 09 行定义联合体类型变量 a;
  • 第 10 行对 a 中的 u2 成员即 a.u2 赋值 5;
  • 接着又通过 scanf 语句对 a.u1 赋值,从键盘输入 1 个字符的 ASCII 码值,这里运行时输入了 65;
  • 那么第12行的输出结果即是此时a中有效的成员 a.u1 的值,输出字母 A;
  • 第 13 行 a.u2 尽管没有实际意义,但由于它和 a.u1 共用一个首地址,且占用相同的存储空间,所以输出的结果是整数 65。

说白了,结构体可以保存很多不同的数据,但是联合体呢,每次只能保存一个成员数据,其他数据是没有的,你要使用另一个成员数据时,你之前保存的也没了。

你问联合体可以干嘛?

嵌入式里面,分离高低位,寄存器封装,经常需要用到

おすすめ

転載: blog.csdn.net/u011397314/article/details/121356943