指针
指针就是地址!!! 存的是地址而不是某个值,因此他的值可以随地址上的值的改变而变化
‘*’
- 声明/定义变量时,表示一个指针变量
float b = 20;
int c = 10;
int *a;定义一个指针变量,指向的内存空间只能存放整数
注意:定义指针变量的时候一定要给初值 不确定就给NULL(否则为野指针)
float *b = NULL;NULL是指向内存的起始地址
int *a = b;不行 指针变量只能存地址 不能存具体值
int *a = &b;不行 整形指针只能存整形数据的地址
int *a = &c;正确
2.除了定义指针变量之外 都是访问某个地址的值
int *temp = &c; 定义指针变量1
*temp = 21; 访问temp地址里面的数据 赋值为21
‘&’
- 取某个变量的地址
- 指针变量在内存中占领八个字节!!!(不管是什么类型)
为什么需要指针
解决跨区域(不同作用域 不同代码块/函数)之间的数据交互
数组与指针的关系
- 数组名并不是一个变量 没有分配内存空间
- 指针变量是有内存空间的
通过实例进行解释
//定义一个数组 系统会分配内存空间 可以存值
int num[10] = { };
//定义一个指针变量 只为变量本身分配8个字节内存空间
//无法存值 因为没有为它分配可以存值的内存空间
int *p;
//如果想给指针指向的地区赋值
//1.指针变量已经指向某块区域
int a3 = 10;
int *pA = &a3;
*pA = 30;
//2.指针指向一个数组
int num2[10] = { };
int *pNum = num2;
//3.动态分配内存 malloc realloc free
//上面两种指向的内存都是别人的
//希望分配一个属于自己的内存空间
//自己分配的内存空间必须自己释放
//普通变量的内存是系统自己分配 所以系统自己负责释放
#include <header>//创建头文件
char *pName = malloc(10 * sizeof(char));
//判断分配是否成功
if(pName == NULL){
//分配失败
exit(EXIT_FAILURE)
}
pName[0] = 'j';
pName[1] = 'a';
pName[2] = 'c';
printf("%s\n",pName);
//当之前分配的内存空间不够了 就需要在之前的基础上重新分配
//realloc 必须是之前使用malloc分配过的
//如果是系统分配的内存 时不能适用realloc的
//用完了就要自己释放内存
pName = realloc(pName,4 * sizeaf(char));
free(pName);
return 0;
demo文件的操作模式
- r 只读 文件不存在就报错 从头开始读
- w 只写 文件不存在就创建 从头开始写
- a 只写 从末尾开始写
- r+ w+ a可读可写
结构体
是一种数据结构 复合数据类型
- 必须要声明一种类型,例如:
struct Person
{
char name[10];
int age;
char *addr;
};
- 定义结构体struct Person变量 变量名xw
int i;
struct Person xw;
//xw.name == "小王";//数组一旦定义 地址不能改变
//不能直接给数组赋值
xw.name[0] = 'x';//系统为变量分配内存了
xw.name[1] = 'w';
xw.age = 30;
xw.addr == "西南大学";//常量字符串地址是由系统分配的
int i1 = 10;
struct Person zs = { "张三",20 };
使用结构体可以方便整洁的将许多不同种类的数据融入到一个结构中并且十分方便调用
PS.
- 经过六七天的入门学习感觉抓住了一点感觉,最大的收获就是承受心理压力的能力和抗击打能力大大增强了(通俗点就是脸皮厚了),不过来日仍可期
- (洗头的时候对着沾满泡沫和头发的双手陷入了沉思.jpg)
人常常会被“解释”束缚住,失去思考的本质
网友评论