指针
为什么要用指针
- 地址 内存空间
- 解决跨区域(不同作用域 不同代码块)之间的数据交互
*
1. 声明定义变量的时候 表示一个指针变量
`float b = 20;`
`int c =10;`
`int *a;`
定义一个指针变量,指向的内存空间只能存放整数
注意:定义指针变量的时候一定要给初值
int *a=b;
不行 指针变量只能存地址,不能存具体值
int *a=&b;
不行,整型指针只能存整型数据的地址
int *a = &c;
正确
float *d = NULL;
NULL指向内存的起始地址 0x00
2. 除了定义指针变量之外都是访问某个地址的值
int *temp =&c;//定义指针变量
*temp = 21;//访问temp地址里面的数据,赋值21
&
取某个变量的地址
指针变量本身在内存空间占据8个字节(64位操作系统中)
int test(void){
return 0;
}
int main(){
int a=10;
int *pa=&a;
int a2[10]= {};
int *pa2=a2;
int(*pFunc)(int)=test;
return 0;
}
数组和指针
注意 数组名不是一个变量,未分配内存空间
- 定义一个数组 系统会分配内存空间 可以存储
- 定义一个指针变量 只为变量分配八个字节内存空间;无法存值,因为没有为他分配可以存值的内存空间
如果想给指针指向的区域赋值
1. 指针变量已经指向某块区域
int a3 =10;
int*pa=a3;
*pa=30;
2. 指针指向一个数组
int num[10]={};
int *pnum=num;
*(pnum+0)=20;
pnum[0]=20;
3.动态分配内存 malloc realloc free
上面两种指向的内存都是别人的,希望分配一个属于自己的内存空间
自己分配的内存空间必须自己释放
普通变量的内存是系统自己分配的,所以系统负责释放
malloc() 在头文件stdlib.h中
char * pname=malloc(3*sizeof(char));
if(pname == NULL){
exit(EXIT_FE=AILURE);
}
pname[0]='j';
pname[1]='a'
pname[2]='c'
printf("%s",pname)
- 当之前分配的内存空间不够用了 就需要在之前的基础上重新分配
- realloc必须是之前使用 malloc分配过的
- 如果是系统分配的内存 是不能使用realloc的
- 用完了就要自己释放内存
pname=realloc(pname,4* sizeof(char));
pname[3]='k';
free (pname);
return 0;
结构体
一种复合数据类型
//声明一种类型 struct Person
struct Person{
char name[10];
int age;
char *addr;
};
//定义结构体变量
struct Person xw;
xw.name[0] = "x";
xw.name[1]='w';
xw.addr = "西南大学"//常量字符串的地址事有系统分配的
struct Person zs = {"zhangsan",20};
学生管理系统
文件的操作模式
1. r 只读 文件不存在就报错 从头开始读
2. w 只写 文件不存在就创建 从头开始写
3. a 只写 从末尾开始写
4. r+ w+ a+ 可读可写
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
// *
int a = 0;
int *p = &a;
*p = 30;
//8
int num[5] = {};
num[0] = 1;
int *p1 = num;
*(p1 + 3) = 30;
p1[2] = 2;
int *p2 = malloc(10 * sizeof(int));
p2[0] = 1;
p2[1] = 2;
p2 = realloc(p2, 2 * sizeof(int));
free(p2);
struct Person {
int a;
double age;
char d;
};
struct Person xw = {};
xw.age =20;
//打开文件
//右键 - 运行 - cmd - 终端 - 拖一个文件到终端
//win + r
FILE *fp = fopen("/Users/pengxiaodong/Desktop/abc.txt", "r");
//写入数据
//音频 视频 图片 -> 二进制数据
//fputs("abc", fp);
struct Student{
char name[10];
int age;
};
//struct Student xw1 = {"xiaowang", 20};
//将结构体写到文件里面去
//fwrite(&xw1, sizeof(struct Student), 1, fp);
//读取数据
//char temp[20] = {};
//fgets(temp, 5, fp);
//printf("%s\n",temp);
struct Student xw1;
fread(&xw1, sizeof(struct Student), 1, fp);
printf("name: %s\n",xw1.name);
printf("age: %d\n", xw1.age);
//关闭文件
fclose(fp);
return 0;
}
体会
终于要告别c语言了,快乐,指针结构体太烦了。学得头大。