赞
踩
1.在定义字符串变量时:结尾处会自动添加结束标志‘\0’(结尾自动添加,占一个字节)
依次赋值为字符时,赋几个字符就是几个单位的字节;
ch2[]所占字节数为6;
ch3[]所占字节数为5;
2.在使用指针时,如果不知道指针要指向哪一个地址,就先使用 (数据类型)* p = NULL;
使用空指针就是为了避免野指针的出现,以免造成不必要的引用所造成的损害;
指针所占的内存大小空间固定为8个字节;
2.1 (数据类型)*(指针名):在定义和初始化的时表示后面的这个变量为指针变量
*(指针名):单独使用就是在调用指针所指向地址里的内容
2.2 p+1和p++的区别:
p+1:指针的指向没有改变
p++:指针的指向偏移了一个数据类型单位的地址
2.3 指针数组和数组指针的理解
首先:【】的优先级比*的优先级高。
2.3.1 指针数组
本质是一个数组,数组里面的元素为指针,本身遵循数组的原则,里面的元素又遵循指针的原则; 数据类型 *p [元素个数]
2.3.2 数组指针 //方便理解,可以理解为行指针
本质是一个指针,指针指向的对象是一个一维数组
- #include <stdio.h>
- int main()
- {
- int a = 1,b = 2,c = 3;
- int *p[3] ={NULL}; //不清楚里面的指针指向的时候就先整成空指针
- p[0] = &a;
- p[1] = &b;
- p[2] = &c;
- int *p[3] = {&a,&b,&c}; //清楚就直接给地址
-
-
- }
-
- /*
- int main()
- {
- Char a[32][32] ={0};
- char (*p)[32]= a; //把第一行的首个元素的地址给到p。
- }
- */
3.当定义void空型时,引用必要进行强转
3.1 强转类型 (数据类型+*)+指针的名字 //使用时必须给定数据类型
强转类型加赋值 *(数据类型 *)指针名字 = 对应类型的赋值
3.2 各个数据类型所占的内存空间大小:
3.2.1:char:1个字节; short:两个字节;int,float:4个字节;double,long:8个字节
4.使用const时,要注意使用的对象
例:
Const int *p = &a;表示*p为只读模式,p所指向的地址可进行修改。
Int * const p = &a;表示p为只读模式(指向不可改变),*p(p所指向的地址里的内容)可以改变。
Const int *const p ;表示p和*p都不可改变。
5. 对数组名的理解:
1.数组名代表这个数组的首地址,而且是个地址常量,不能被改变;
例:和指针一起用时,指针的指向就是数组的首地址;
2.数组名代表整个数组;
例:算数组的大小时sizeof(数组名)
5.1数组的初始化:
如果数组进行部分初始化,未初始化的部分会进行自动补0 // '\0' == 0
二维数组初始化时: 省略初始化只能省略行数,不能省略列数,更不能全部省略。
6.位运算符
位运算时 针对二进制的每一位的运算!!!!!位对位进行按位的与或非运算
6.1 运算符的优先级:单目运算符 > 双目运算符 > 三目运算符
单目运算符:就是只存在一个操作数,比如a++,++a,逻辑反 !;
双目运算符:就是存在两个操作数,比如a+b,a*b, 逻辑或‘ | | ‘(有真为真) ,逻辑与 ’&&‘ ( 全真为真,有假为假)
三目运算符现在只有一个‘?’比如a?b;c当a为真时,执行b,为假时执行c;
6.2 判断真假时,只有为0时才为假,非0全为真(只要不是0,就为真);
6.3 位的清零和置1:
1.清0通式:将A的第n位清零
A & ~( 1<<n);
2.置1通式:将A的第n位置一
A |1<<n;
7.函数
7.1输入输出函数
scanf(“格式控制串”,对应变量的地址);以非法字符为结束标志;
想要使用scanf输入带其他非法字符的字符串,可以使用Scanf(“%[^\n]”,对应变量的地址);
puts();输入字符串,会读入“\n”,字符数加一;
getchar函数的定义:char a =getchar(); //getchar(),putchar()是单个字符的输入输出
7.2功能体函数
7.2.1:递归和回调函数
递归函数:
1.直接或间接的调用自己,自己调用自己就是递归函数了
2.必须满足的条件:
(1):必须有一个终止处理或计算的准则。
(2).在每一次调用自己时,必须更接近于要返回的解。
回调函数:
回调函数就是:一个通过函数指针调用其他函数的函数。如果你把函数的指针(地址)作为 参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是 回调函数。(调用其他的函数)
7.3 常用的函数----头文件:#include <string.h>
1. 测量净长度的函数(不包括'\0'):strlen:int (变量名)= strlen(要测量的变量的首地址)
注意:strlen的返回值为整形数值 输出格式%d;
2.strcpy:复制函数(覆盖原来地址的内容)【strcpy(str1,str2)】
3.Strcat(连接(追加)函数)同复制函数的操作方法
4.Strstr (找到所要字符串在目标字符串的首次出现的地址;)
例:「arr =“handsome”;arr1 =“some”;
Strstr(arr,arr1);在arr中找到arr1的出现位置(地址);返回值类型是地址,如果没有找到,就返回NULL(空);
7.4 结构体
结构体:(注意数据类型所用的空间,空间不够可以用数组或指针)是一个可以存放多种数据类型的数据;
定义方法:
typedef struct +结构体名
{
成员表1;(数据类型加上变量名;)
成员表2;
。。。。。(每个成员的数据类型可以不同)
}+结构体变量名(调用直接调用此处的变量名);(结尾这里的分号不能省略)
7.4.1 结构体大小的计算:
1. 计算每一个成员存储空间的大小,按照字节序对齐的方式;
字节序对齐:如果成员的最大存储空间>=8,按照8字节对齐;:如果成员的最大存储空间<=8,按照最大成员的数据类型的字节对齐;
2. 定义时 同一char或short类型不连续定义的会分别开辟内存空间;同时遵循偶数地址存储的原则;
- typedef struct test1
- {
- int a;
- char b;
- int c;
- short d;
- }T;
-
-
- typedef struct test2
- {
- int a;
- int c;
- short d;
- char b;
-
- }T1;
-
- //此时T和T1开辟空间大小就不相同,开辟空间是连续的,short占两个字节,剩下的两个内存空间会给到下一个char型(char只占一个字节空间),存放遵循偶数地址存储的原则
7.5 共用体union
共用体与结构体的区别:
1.开辟空间的大小不一样:共用体只计算最大成员的大小,但也遵循字节序对齐的方式;
2.存储方式不同:共用体共用一片空间地址,只能一个一个存储;
7.6 参数的传递
1. 值传递
例:加函数代码
2.地址传递
*地址具有唯一性*
3. 数组的传递:(传递的是数组的首地址)
数组传数组
数组传指针
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。