黑马程序员 _4 C语言基础 数组,指针,字符串

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

一、数组

数组就是将一组相同类型的数据收入进一个变量里面,便于管理像是n个人的年龄,或者是m个人的学号,二维数组就是多个一维数组归入到一个变量里面。

数组的特点是:只能存放一个类型的数据,此数据称之为“元素”,元素在数组中存储是有着顺序的,有对应的下标,从0开始。

数组定义的格式: 

元素类型 数组名[元素个数];    

比如: int ages[3];

数组必须定义时初始化,不能先定义变量再初始化;

初始化方式为:

int a[3] = {10, 9, 6};
int a[3] = {10,9};
int a[] = {11, 7, 6};
int a[4] = {[1]=11,[0] = 7};//

以下为错误的;定义或初始化方式:

inta[];

int[4]a;

inta[b];

a = {10, 11};

a[4] = {10,9,8,5}; 

二维数组的初始化类似:就是将其中的一维数组可以逐个初始化:

int a[3][4] = {1,2,3,4,5,6};

int a[3][4] = {{},{},{}};

二、字符串

字符串如其名就是n个char字符串起来,组合成了字符串,利用字符串数组可以存储字符串:

字符串的初始化:char a[]="145243";最后面会默认加上’\0’表示字符串到这里结束;

而字符串中的%s”,’\0’是不会输出的;

字符串函数:strlen 计算字符串长度

 1.计算的是字符数,并不是字数。一个汉字算作3个字符

 2.计算的字符不包括\0

 3.从某个地址开始数字符的个数,直到遇到\0为止

    char name2[] = {'0', '\0', '6'};
    
    int size = strlen(name2);
    
    printf("%d\n", size);//结果为1 
注意:\0的作用:

 1.字符串结束的标记

 2.printf("%s", name2); 

 会从name2这个地址开始输出字符,直到遇到\0为止

三、字符串数组  

使用主要有以下场合:

1.一维字符数组中存放一个字符串

2.要存储多个字符串

初始化:

1.char names[2][10] = { {'J','i','n','g','\0'}, {'D','i','\0'}}; 

2.char names2[2][10] = {{"Jing"}, {"Di"} }; 

3.char names3[2][10] = { "Jing","Di" };

三、指针

格式如下:

 // 变量类型  变量名;
    // 格式:变量类型 *变量名;
    // 定义了一个指针变量p
    // 指针变量只能存储地址
    // 指针就一个作用:能够根据一个地址值,访问对应的存储空间
    // 指针变量p前面的int:指针变量p只能指向int类型的数据

指针就是用来保存变量的地址的变量,

1.我们通过&来获取变量的地址。

2.&这个操作符只能指向变量或者是数组。

3.&是获取地址的操作符。

4.使用%p来打印地址。

 指针的本质:       指针是一个4字节(或是8字节)的一个int的整数。换句话说也就一个int型的变量。

没有初始化的指针 ,称之为野指针,野指针有很大的风险。

空指针: int*p;p = NULL;或者p = 0;注意:永远不要使用一个空指针。在C里,使用空指针会有一个空指针错误。会使得程序崩溃。

注意事项 :

1>指针变量只能存储地址

2>指针变量未经过初始化,不要拿来间接访问其他存储空间

3>定义变量时的*仅仅是一个象征,没有其他特殊含义

4>*p = 20;    这个时候的*的作用:访问指向变量p指向的存储空间


指针经常和字符串一起使用 ,定义字符串时利用指针的话字符串不能再修改:

定义字符串的2种方式

 1>利用数组

 char name[] = "jingdi";

  *特点:字符串里面的字符是可以修改的

  *使用场合:字符串的内容需要经常修改

 

 2>利用指针

  char *name = "jingdi";

  *特点:字符串其实是一个常量字符串,里面的字符是不能修改

  *使用场合:字符串的内容不需要修改,而且这个字符串经常使用

四、结构体

一个人有年龄、身高、体重、姓名等多种不同类型的属性,若想将其定义在一起,就要用到结构体的方式。

结构体就是可以由多个不同类型的数据构成。

定义过程:1.先定义结构体的类型,就是包含什么属性的数据:

struct Person  
{  
     int age;  
     double height;  
     charchar *name;  
};  

2.利用结构体类型定义变量,也相当于初始化一个变量:

struct Person p = {19,1.75,"张三"}; 

结构体在使用中非常常见,有三种定义方式:

 1是刚刚的先定义类型,在定义变量,2就是同时定义,如  

 struct Student 

{

int age ;

double height;

} student;

3就是把2的类型省略,(2中的Student去掉)

还有的就是结构体就是一种变量,所以作用域与变量相同,再函数外就是 全局有效,在函数内,就相当于局部变量

五、枚举

枚举有点像是指针字符串数组,是变量只能取事先定义好的数据,

定义过程:  

enum Season
    {
        spring = 1,
        summer,
        autumn,
        winter
    };

如果 spring没有定义值的话,默认为0,之后依次为1,2 ···

六、预处理命令

预处理命令有点像是开发者为方面自己而设置好一些变量或方法的一个功能,他的作用范围是从它出现的位置到文件尾。

它是在编译前就替换为定义的内容,所以是叫做编译预处理。

1.宏命令

  分为带参数的何不带参数的两种形式,带参数的效率要高。

不带参数一般形式:

#define 宏名 字符串

 比如#define ABC 10 //宏命令一般要用大写,用来和变量区分,非语法要求,不会替换用双引号括起来的字符串替换。

带参数的一般形式 

 #define average(a, b) (a+b)/2   有点像是定义一种平均值的方法average。

注意:宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串。

2.条件编译

如其名就是程序的一些代码满足设定条件才会参与编译。

用法

#if 条件1
 ...code1...
 #elif 条件2
 ...code2...
  #else
 ...code3...
  #endif
类似if语句,#endif 不能省略,代表着条件编译的结束。

3.文件包含     就是#include

第1种形式#include <文件名>     用来调用c库中的文件

第2种形式 #include "文件名"     用来调用当前目录的文件,找不到才会去库中寻找。

七、typedef

  利用typedef可以给已经存在的类型起一个新的名称, 可以使用的类型有 基本数据,指针,结构体,枚举,指向函数的指针。

好处是可以将一些比较不方面书写的类型定义成自己方面书写的,当然原先的还可以使用。

八、static与extern

static对函数的作用:

 1> 定义一个内部函数 

 2> 声明一个内部函数

  extern对函数的作用:

 1> 完整地定义一个外部函数

 2> 完整地声明一个外部函数

 (extern可以省略,默认情况下声明和定义的函数都是外部函数)

所以一般情况下extern都不需要书写出来,static像是定义一个私有函数,自己的孩子,不让别人碰。

 

九、递归 

c语言的函数可以递归调用,即函数可以直接或间接调用自身。 

 递归的2个条件:

 1.函数自己调用自己

 2.必须有个明确的返回值 


---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值