C语言基础(七)字符串 类型重定义 结构体

字符串

字符串是由字符数组构成的并且以\0作为结束符字符串用双引号引起来;

字符数组与字符串的区别

字符数组不需要以\0结尾,

字符串的初始化

1.最复杂的方式

char b[]={'h','e','l','l','o','\0'};

以字符数组的形式,一个字符一个字符的初始化

2.相对简单的方式  (用双引号引起来的字符串来初始化一个数组)

char c[11]="Good Day1";

用一个字符串来初始化一个字符数组,或则char c[]="Good Day1”;省略下标

直接用双引号引起来的字符串叫做常量字符串,赋值过程,将常量字符串的内容拷贝到字符数组中

3.另外一种初始化方式  (用指针指向一个字符串)

char *pstr="Good Day!";

把一个字符串赋值个一个字符指针,则这个指针指向字符串的首元素,且这样的字符串是一个字符串常量,即“Good day!”,存储在常量区,其内容不能被修改,等价于const char * pstr=“GoodDay!”

字符串的三种存储方式

1.栈区,字符串的内容可以被修改

char a[]={'h','e','l','l','o','\0'};

    a[0]='H';

2.常量区,字符串的内容不可以被改变

char *c="hello";

printf("%s\n",c);

3.堆区,使用malloc函数在堆区开辟一块空间,再将字符串存入,字符串的内容可以被改变

char *d=(char *)malloc(6);

    d[0]='h';

    d[1]='e';

    d[2]='l';

    d[3]='l';

    d[4]='o';

    d[5]='\0';

    free(d);

 

charb[]={'h','e','l','l','o','\0'};//'\0\'是字符串的结束符,如果没有\0就是字符数组就不是字符串字符串的本质也是字符数组

   printf("%s\n",b);//用%s打印,逗号后边是字符串的地址

//%s从字符串的第一个字符开始一直打印到\0结束符结束。

 

   printf("%s\n",a);

   for (int i=0; i<5;i++) {

       printf("%c\t",a[i]);//字符数组只能挨个打印

   }

#include

int main(){

   //1.一个字符一个字符的初始化字符串,最后一个字符是\0;

   char a[]={'h','e','l','l','o','\0'};

   //2.

   char b[]="hello";//直接用上引号引起来的字符串叫做常量字符串,赋值过程:将常量字符串的内容拷贝到字符数组中。

   //3.用指针指向一个字符串。

   char *c="hello";//栈上的指针保存常量区字符串的首地址。

   //c[0]='H‘,指向常量的的字符串所以字符串的值不能修改。

return 0;

strcpy  char *strcpy(char *to, const char *from);字符串的拷贝

//strcpy(d, b);不能往常量区拷贝

//注意的问题  1.空间要足够大

strcmp (str1,str2) st1>str2返回值大于0;

str1

str1=str2  返回值等于0

   char *a="hello";

   char *b="Hellow world";

   //字符串比较大小:从两个字符串的第一个字符一个字符一个字符的比较asc码;直到两个字符不一样就可以比较出字符串的大小

int n=strcmp(a,b);//strcmp函数的返回值有三种。大于零,小于零,等于零。

//求字符串的长度不包括\0的位置

//直到什么时候就怎么样的时候用while,这样可能是最简单的

//写程序时尽可能将问题模块儿化,划分成简单的问题


类型重定义

给已经存在的类型重新起一个名字 typedef 称为类型重定义或类型重命名;

结构体:指的是一种数据结构,它用于表示有关联的元素;

数组:相同类型的值的集合。

结构体:有关联的元素的集合。

定义结构体的三种形式

①   先定义结构体,再声明结构体变量;

②   定义结构体的同时声明结构体变量

③   类型重定义

可以类比枚举,格式都是一样的。

int main(){

   STUDENT s1;    //如果声明的时候没有初始化,只能再一个一个初始化。

 

   STUDENT s2={12,"ni","sb"};

   STUDENT s3={16,"wo","shijie"};

   //字符数组 进行单个初始化的时候只能进行 拷贝;

   s1.stuId=19;

   strcpy(s1.name, "doubi");

   strcpy(s1.address, "henan");

   STUDENT *m=&s1;

   printf("%s%s\n",s1.name,s1.address);    //结构体变量用.访问

   printf("%s%s\n",m->name,m->address);  //结构体指针用->访问

   return 0;

}

m->name 等价于(*m).name

计算结构体的大小两条规则

一、      结构体中的从第二个成员开始,按自身字节数补齐(把其那边的内存补齐成自身字节数的倍数,有0补齐)

二、      结构体最终的大小是结构体成员中最大字节数的倍数

#include

typedef struct {

   int a;

   double b;

   char c;

   short d;

   char f;

}STR;

typedef struct{

   double a;

   char b;

   int c;

   short d;

}STR1;

int main(){

   printf("%ld\n",sizeof(STR));//24

   printf("%ld\n",sizeof(STR1));//24

}

//包含头文件,将头文件中的内容拷贝到当前位置

//头文件中是函数的声明,源文件中是函数的实现

#include //系统头文件用<>

#include "hello.h"//自定义的头文件用“”

#include

#define PI 3.14159//宏定义(宏替换)单纯的替换掉文本中的文本内容 宏定义不要带分号,标识符一般大写

#define add(x,y) x+y //宏定义不分配内存,变量定义分配内存 预处理不做语法检查

#define mul(x,y) (x)*(y)//带参数的宏

int main(){

   

   printf("%f\n",PI);

   printf("%d\n",add(1,2));

   printf("%d\n",mul(1+2, 3+5));

   return 0;

}

#if #elif #else #endif 这几个指令称为条件编译指令,可对程序源代码的各部分有选择的进行编译。


你可能感兴趣的:(c语言)