黑马程序员--C语言之复杂数据类型

这篇博客详细介绍了C语言的复杂数据类型,包括枚举、数组、字符串和指针。枚举是一种定义常量集合的方式,数组用于存储固定数量的数据,字符串在C语言中以字符数组形式存在,指针则存储变量的地址。文章还提到了结构体,它是不同数据类型的组合,以及预处理指令,如宏定义、条件编译和文件包含,强调了它们在编译过程中的作用和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

C语言的学习过程大致上包括基本语法、基本运算、流程控制等。本篇博客先总结下C语言的复杂数据类型。

使用工具:Xcode5.1.1



复杂数据类型主要包括枚举、数组、字符串和指针等

枚举

枚举的基本形式:enum 枚举名 {枚举值表(即枚举元素)}

枚举定义变量的方式:

方式一:

enum score { score , avgScore , sumScore};

enum score a , b , c ;

方式二:

enum score { score , avgScore , sumScore}a,b,c;

方式三:

enum { score , avgScore , sumScore}a,b,c;


枚举使用注意:

1、枚举值是常量,不能是变量

2、枚举元素本身由系统定义了一个表示序号的值:0、1、2.。。。。。可以这样访问

例:a = (enum score)1;//相当于 a = avgScore ;

3、枚举元素不是字符常量也不是字符串常量,用的时候不能加单、双引号


数组

数组的基本形式:数组类型  数组名[ 数组长度]={元素},如:int age[4]={100,68,88,95,59}

例:3个班各班学员人数

#include <stdio.h>
int main()
{
	int everyClassCount [ 3 ]= { 36 , 40 , 33};
	for(int i = 0;i<sizeof(everyClassCount)/sizeof(int);i++)
	{
		printf("%d斑有%d人",i+1,everyClassCount[i]);
	}
	return 0;
}


数组使用注意:

1、数组的内存存储:按照元素下标由小到大顺序。

2、数组的元素长度为变量时一般不能同时初始化;如果用到变量并进行初始化,可以用宏(#define)来处理。

例:

#include <stdio.h>
#define COUNT=6
int main()
{
int num[COUNT] = {15,20,65,95,15,23};//在未定义宏时此用法错误,但定义宏后可使用
printf("%d",num[5]);
return 0;
}

字符串

C语言中字符串存储需用数组。

例:打印hello,并区别字符串和字符数组

#include <stdio.h>
int main()
{
//字符串会以"\0"结束。
char word1[] = "hello";//字符串
char word[] = {'h','e','l','l','o'};//字符数组
char word3[] = {'h','e','l','l','o','\0'};//字符串
printf("%s",word1);
printf("%s",word2);//word2是字符数组,强制以字符串打印会打印后面的字符或字符串(知道遇见"\0"为止)
return 0;
}

字符串使用注意:

1、char name1 [] ="Jerry"和 char name2 [] ={'T','o','m'},第一个是字符串,第二个是字符数组,字符串会以"\0"结束。

2、strlen用来计算除“\0”以外字符串的长度。


指针

指针的基本形式: 变量类型 *变量名

#include <stdio.h>
int main()
{
//指针指向的是存储位置,因此要在指向的变量前面加上&
int a = 10;
int *p= &a;//可以这样使用,但是int *p;*p=&a;此用法错误
*p = 30;
printf("%d",a);//由于指针p指向a,所以p修改,a的值也会改变
return 0;
}


指针使用注意:

1、指针变量只能存储地址,所以在赋值时会以*p=100 等。

2、int *num=&a;//正确用法

int *num;

*num=&a;//错误用法,&a、num本来就是存储地址,*num代表指向num地址的地址。

3、"*"在定义和使用时作用大不相同:定义时int *相当于一个数据类型;在使用时,是访问p所在的存储空间。

4、指针用在数组时,指向数组的首元素,指针可以像数组一样访问元素。

例:

#include <stdio.h>
int main()
{
int count[]={99,55,33,22};
int *p=&count;
printf("%d\n",p[2]);
printf("%d\n",p+2);
return 0;
}

结构体

结构体是不同数据类型的集合。很多地方类似于数组。

结构体的形式:

struct 结构体名

{

结构体元素

};

例:

#include <stdio.h>
int main()
{
	struct Person
	{
		int age ;
		char name[] ;
		double weight ;
	};//分号不可省
	struct Person p1 = { 10,"Jack",45.2};
	struct Person p2 = {.weight=60.5,.name="Lucy",.age=22};
	printf("%s,\ %s",p1.name,p2.name);
	printf("%d,\ %d",p1.age,p2.age);
	printf("%f,\ %f",p1.weight,p2.weight);
	return 0;
}

结构体变量定义和赋值方式:

方式一:

struct Person

{

int age;

char name[];

double weight;

};


struct Person p1 = {33,"Tom",100};

方式二:

struct Person

{

int age;

char name[];

double weight;

}p2 = {22,"Jerry",65.5};

方式三:

struct {

int age;

char name[];

double weight;

}p3 = {20,"Angle",55.5};


和数组类似,结构体也可以嵌套:

例:

#include <stdio.h>
int main()
{
	struct Date
	{
		int year;
		int month;
		int day;
	};
	struct Person
	{
		int age;
		struct Date birthday;//嵌套struct
		char *name;
	};
	
	struct Person p = { 20,{1990,10,11},"Moly"};
	printf("%d\n",p.age);
	print("%d,%d,%d\n",p.birthday.year,p.birthday.month,p.birthday.day);
	printf("%f\n",p.weight)
	return 0;
}


预处理指令:

C语言预处理指令是编译过程中一个单独的步骤。所有的预处理指令都用"#"开头。常用预处理指令可分为:宏定义、条件编译、文件包含

1、宏定义:#define

例:见数组例。


宏定义使用注意:

1、例如:

#define NUM 10
int main()
{
	char *s = "NUMBER";
	printf("%s\n",s);
	return 0;
}
双引号中NUM不会被替换

2、宏和函数的区别:

宏定义在编译之前进行(效率比函数高);函数在打开程序时才调用。

3、宏定义不检测类型


2、条件编译。

#if 条件1

代码1

#elif 条件2

代码2

#else

代码3

#endif
形式虽然和if-else类似,但是在运行时所有的if-else语句都要编译,而条件编译是满足条件再编译。

例:

#include <stdio.h>
#define COUNT 5
#if COUNT>5
	printf("COUNT大于5");
#elif COUNT<5
	printf("COUNT小于5");
#else
	printf("COUNT等于5");
#endif

int main()
{
	int num[COUNT]={10,11,12,13,14};
	for(int i=0;i<count;i++)
	{
		printf("%d\n",num[i]);
	}
	return 0;
}


条件编译使用扩展:

检测是否定义宏:

 #if defined(NUM)//#ifdef NUM等同

     printf("已定义");

     #endif

     

     #if !defined(NUM)//#ifndef NUM等同

     printf("未定义");

     #endif

3、文件包含。

#include <stdio.h>//用尖括号是包含系统文件

#include "program1.h"//引号是优先包含所在目录的文件,如果所在目录没有,在系统目录找

文件包含使用注意:

test1.h文件

//test1.h
#include <stdio.h>
void test1()
{
	printf("This is test1");
}

test2.h文件

//test2.h
#include <stdio.h>
#include "test1.h"
void test2()
{
	printf("This is test2");
}

test.c文件

//test.c
#include <stdio.h>
#include "test1.h"
#include "test2.h"
int main()
{
	test1();
	test2();
	return 0;
}

这样写是错误的test2中已调用test1,应该改进test1和test2

test1.h文件

#include <stdio.h>
#ifndef _TEST1_
#define _TEST1_
void test1()
{
	printf("This is test1");
}
#endif


test2.h文件

#include <stdio.h>
#ifndef _TEST1_
#define _TEST1_
#include "test1.h"
void test2()
{
	printf("This is test2");
}
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值