TMDBug

Code Change The World And Make It Better!

TMD.Bug

C语言学习笔记(二)

5.数组

5.1 数组相关解说

①. 什么是数组?【答】数组是存储一组有序的相同类型的数据的集合。
②.数组的定义格式?【答】数据类型    数组名 [常量表达式]
1、数据类型 就是C语言中提到的数据类型 规范数组中存储的所有元素的类型
2、数组名 要符合标识符规范
3、常量表达式  的含义 就是数组中存储数据的个数

5.2 一维数组
①.int a[20];
//称a为20个元素的数组,每个元素都为int型;(通俗的讲就是一次性声明了20个int 变量;)
* 数组完全初始化:a[3]={1,2,3};
* 数组部分初始化:a[10]={1,2,3};   没有被初始化的变量元素为零;
* int a[5]; 其中a是数组,不能说a[5]是数组;可以说,a是int 5类型的数组;
* 数组不能整体赋值; int a[5];a[0]=1,a[1]=2;//这样写对!   int b[5];b=a;//这样写是错的,数组不能整体赋值;
a[4],内存中是这样存储的:a[0]占4位地址,a[1]占4位地址,a[2]占4位地址,a[3]占4位地址!!!当我们访问数组某个元素的时候,内存会自动找到相应的4位,如果要打印,会把首位地址打印出来;首位地址代表该元素的地址;

5.3 二维数组

①.二维数组的定义
二维数组定义的一般形式是:
类型说明符 数组名[常量表达式1][常量表达式2]
其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:
②. int a[3][4];
说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:
a[0][0], a[0][1], a[0][2], a[0][3]
a[1][0], a[1][1], a[1][2], a[1][3]
a[2][0], a[2][1], a[2][2], a[2][3]
二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。
③.  二维数组的元素也称为双下标变量,其表示的形式为:
数组名[下标][下标]
其中下标应为整型常量或整型表达式。例如: a[3][4];  表示a数组三行四列的元素。
下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。

5.4 常见排序

①.冒泡排序

②.选择排序

6、函数

6.1 函数相关解说

① .  将一些繁琐的,反复的,重复使用的代码,封装成一个函数,调用函数;

之所以要使用函数:因为:1、代码模块化 代码结构更简单。2、便于修改代码。3、代码的重用

6.2 有无返回值、参数
generic seroquel 返回值;就是函数调用表达式的值;
每个函数都可以调用其他函数;只用main可以调用其他,其他不能调用main;
每个大括号都是一个单独的作用域;
一个函数里面所有的成员变量,都会随着这个函数的消失而消失;
//不能返回一个函数内的局部变量的地址;
当内存开辟一个main函数空间时,我们称之为main函数的栈;当开辟一个其他函数的空间时,也就是其他函数的栈。其他函数栈中的变量会随着栈的消失而消失;
②、 参数写成void就是没有参数的函数;

6.3 递归函数

① .递归函数,就是函数自己调用自己本身,在递归函数中一定要有return语句,否则死循环。

7.指针
7.1 函数内外的两个数值都交换

① .

7.2 指针相关解说
① .//指针变量的定义形式:   (1)数据类型 * 指针变量名;      (2)定义指针变量时 * 只是一个标识 没有什么实际意义 标识这个变量是指针类型的      (3)指针变量里面存储的是地址
//访问指针变量存放地址里面的内容 使用  *指针变量名
如果没有给指针赋值 系统会给其一个随机值 获取指针指向的地址里面的内容 程序崩溃,这种指针称为野指针.
//无论什么类型的指针 使用sizeof打印在内存中所占字节数 都是相同的
//void* 万能指针 能够接收任意类型变量的地址     //打印万能指针 指向的地址里面的内容  要先进行强制类型转换
7.3 指针指向

① . const 关键字修饰指针变量;     char a=’A’;     const char *p=&a;     char const *q=&a;
1.*星前const:表示p可以改变,*p不可以改变,因为const修饰*p;     char b=’B’;     p=&b;     这时可以编译,完全没问题,p可以改变,但是*p不可以改变;     如果再把*p=’C’;这时会报错;read-only只读;     但是b还是可以改变的;     b = ‘C’//这样是完全可以的;     a=’D’//这样也是完全可以的;
2.*后const;     char a = ‘W’;     char b;     char * const p=&a;     *p=’X’;这样是可以的;     p = &b;这样就不行了;     const char * const q = &a;     这样无论是*q还是q均不可改变;     修饰哪个哪个不可改变;     修饰*P那么*P不可改变;     修饰p,那么p不可改变;     要修改一个变量,传参传变量的地址;分清值传递和址传递;传参如同赋值;

a[5]={1,2,3,4,5};     数组名a就代表a[0]的地址;     传参数时,如果看到数组名a,那就代表a[0]的地址;     a[0]==*(a+0)==*a;     a[i]==*(a+i);     取*之后,是可以改变main函数的值的;     只要加上const便不可修改值;
7.4 复杂数据类型的拼凑
int (*p)[10]         printf(“%ld,%ld\n”,sizeof(p),sizeof(int (*)[10]));     //8  ,8         这是一个指针;指针都是8字节;它指向10个整型元素的数组;         int **p;二级指针;       这是一个指针,它指向另一种指针,该指针指向整型;二级指针可以改变指针的指向;         int *p(int);         这是一个函数,它的参数是一个整型,返回值是一个指向整型的指针;         int (*p)(int);         这是一个指针,它指向参数是int返回值是int的函数;这种指针称之为:函数指针;         int((*p[10])(int))(int);         这是一个数组,10个元素;每个元素是某种指针,这种指针指向函数,该函数参数,参数一个int,返回值是另一种指针,该指针指向参数int 返回值int的函数;         数组(应该有80个字节;)因为它有10个元素;每个元素是指针;

8、字符串
8.1 字符串的使用 (常用函数:比较、拼接、分割)

当我们写”hello”时,就是告诉编译器,在只读数据段存在6个字符;
只读数据段:在内存中调一个函数时,会存在一个栈内,但是字符串是存在于一个离栈很远的只读数据段中,专门存储只读数据;它和栈是并列关系;
“hello”表达式的值,表示字符串第一个字符的地址;
write(i,j,k)这个函数:代表将j,打印到终端上,打印k个字节;
“hello”,在只读数据段中,存储了6个字节的6个字符地址为h的一个字符串;
只读数据段的数据不可修改;
有效字符:不包括/0的字符串;
查看有效字符用 strlen()这个函数来计算,打印用 %ld 来打印;严格上来讲应该用%u来打!
strlen遇到/0就结束计算了;
atoi 函数;传参 字符的地址(字符串首字符地址)碰到一个不是数字的字符就停下来,如果遇到负数,能识别出第一个负号,不能识别后边的符号;
strcmp 字符串比较函数 ;比较字符串:传入两个字符串,参数1比较大,返回正数;参数2比较大 返回负数;相等则返回0;

* strcmp(参数1,参数2);

比较的方法:比较首字符的ascll码;如果相同,则比较第二个字符……

需要引入头文件:#include<string.h>
strcpy:(完成一个字符串的拷贝)传参传入两个字符串;将后边的参数,拷贝到前边的参数中;(前边参数的空间必须足够大,否则不能全部拷贝进去)

* char *p= “helloworld”; char buf[64]={}; strcpy(buf,p);printf(“%s”,buf);
* //打印出:helloworld

未初始化的指针不能赋值;(未指向空间)
strcat:(表示字符串的拼接);

* char buf[64] = “hello”;char *p=”world!”;strcat(buf,p);printf(“%s\n”,buf);//buf的空间必须足够容纳拼接之后的字符串;字符串拼 接时,前边那一段的\0会去掉,中间不会有尾0;
* //打印出 helloworld

strstr(在一个字符串中,查找另一个字符串)传入两个参数,在前边参数中,查找后边参数;查到该位置后,输出后边的字符串;如果查找中有两个想查字符串,查找到的是第一次出现的位置;如果没有要查字符串;则返回空,什么也不打印;

* char *p=”welcome to qianfeng!”;
* char *q=”to”;
* ret = strstr(p,q);
* printf(“%s”,ret);
* //打印出 to qianfeng!

#include <string.h>
strtok:(字符串分割函数)传入一个空间,传入一个字符串;只能分割可变的字符串;
第一个 是要分割的字符串{前提是这个字符串一定是可变的,可更改的字符串;空间是可变的};第二个参数是分隔符;

* char *p=” hell wo de”;//无法分割;
* char p[64]=”i am so bad man”;char *ret =strtok(p,” “);//分隔符为空格;printf(“%s”,ret);
* //打印出 i
* //如果想继续分割后边的字符串 如 am
* //则再次调用strtok;
* //只不过传参要传空
* ret = strtok(NULL,” “);
* //传空 表示 继续分割之前的字符串
* //传的不是空,表示分割新的字符串
* //原理是将分隔符换成’\0′;如果被分割的不为可变,那么分隔符,将不能替换成尾零,程序会报错;

完全分割;分割字符串中所有的字符;

* #include <stdio.h>
* #include <string.h>
* int main(){
* char but[] =”hello,welcome to qianfeng!”;
* char *p=buf;
* while(1){
* p= strtok(p,”, “);
* if(!p)
* break;
* printf(“%s”,p);
* p=NULL;
* }
* return 0;
* }
* //这样,它会以每一个逗号或者空格作为分隔符;

//分割出来的字符串,不仅仅是可以打印出来,它也可保存到其他字符串数组中,可以再声明一个字符串数组: char * jie[5]={};int i;jie++ = p;

2015年8月13日 0 / /
标签: 

9 + 1 =

回到顶部