c语言-----指针
1.声明/定义变量的时候 表示一个指针变量
float b = 20;
int c = 10;
int *a; //定义一个指针变量 指向的内存空间只能存放整数
// 注意:定义指针变量的时候一定要给初值 不确定就给NULL
int *a = b;//不行 指针变量只能存地址 不能存具体值
int *a = &b;//不行 整形指针只能存整形数据的地址
int *a = &c;//正确
float *d = NULL;NULL指向内存的起始地址 0x00
2.除了定义指针变量之外 都是访问某个地址的值
int *temp = &c;//定义指针变量l
*temp = 21; 访问temp地址里面的数据 赋值为21
//‘&’ 取某个变量的地址
3.要学好指针就要抓住两点 (1)地址 (2)内存空间
为什么要用指针:解决跨区域(不同作用域 不同代码块)之间的数据交互
指针最忌讳的:野指针:也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
注:指针变量在内存里面占据8个字节空间
int main(int argc, const char * argv[]) {
int a = 10;
int *pa = &a;
int a2[10] = {};
int *pa2 = a2;
int(*pFunc)(int) = test;
char c = 'a';
char *pc = &c;
printf("%lu\n",sizeof(a)); //4
printf("%lu\n",sizeof(pa));//8
printf("%lu\n",sizeof(a2));//40
printf("%lu\n",sizeof(pa2));//8
printf("%lu\n",sizeof(pFunc));//8
printf("%lu\n", sizeof(pc));//8
4.数组与指针在内存上的差别:
数组名并不是一个变量 没有分配内存空间 int a = 10;
指针变量是有内存空间
定义一个数组 系统会分配内存空间 可以存值
int num[10] = {};
定义一个指针变量 只为变量本身分配8个字节内存空间
(无法存值,因为没有为他分配可以存值的内存空间)
int *p;
给指针指向的区域赋值:
1.指针变量已经指向某块区域
int a3 = 10;
int *pA = &a3; //指向变量a的内存地址
*pA = 30;
2.指针指向一个数组
int num2[10] = {};
int *pNum = num2; //指向数组num2的首地址
*(pNum+0) = 20; 等价于 pNum[0] = 20;
*(pNum + 1) = 30; 等价于 pNum[1] = 30;
C语言————动态存储
3.动态分配内存
三个点: malloc realloc free
上面两种指向的内存都是别人的,是系统分配的,一般当出了作用域 内存就会被释放。
而此方法希望分配一个属于自己的内存空间
自己分配的内存空间必须自己释放
注:普通变量的内存是系统自己分配 所以系统自己负责释放
char *pName = malloc(3 * sizeof(char));
//判断分配是否成功
if(pName == NULL){
//分配失败
exit(EXIT_FAILURE);
}
//若分配成功,使:
pName[0] = 'j';
pName[1] = 'a';
pName[2] = 'c';
//当之前分配的内存空间不够了 就需要在之前的基础上重新分配
//realloc 必须是之前使用malloc分配过的
//malloc分配的内存不够用时,用realloc增加分配内存 并将malloc 上的内容复制过去 并将之前malloc分配的内存清除
//如果是系统分配的内存 是不能使用realloc的
//用完了就要自己释放内存
pName = realloc(pName, 4*sizeof(char));
pName[3] = 'k';
printf("%s\n", pName);
free(pName);
return 0;
}
C语言————结构体
结构体 是一种复合数据类型
//struct
//声明一种类型 struct Person == int
struct Person {
char name[10];
char *addr;
int age;
};
// int i1 = 10;
// struct Person zs = {"张三", 20};
//定义结构体struct Person变量 变量名xw
int i;
i = 20;
struct Person xw;
//xw.name = "小王";此用法错误!! *数组一旦定义 地址不能改变
//不能直接给数组赋值
xw.name[0] = 'x';//系统为这个变量分配内存了
xw.name[1] = 'w';
//xw.addr = "西南大学";此用法正确 *常量字符串的地址是由系统分配的
//先为addr分配内存
xw.addr = malloc(4 * sizeof(char));
xw.addr[0] = 'S';//字符指针赋值 必须要有内存
xw.addr[1] = 'o';
xw.addr[2] = 'u';
xw.addr[3] = 't';
xw.age = 30;
printf("name:%s\n", xw.name);
printf("addr:%s\n", xw.addr);
C语言————文件操作
写入数据:
int main(int argc, const char * argv[]) {
//打开文件
//fopen("abc.txt",const char *restrict __mode) ;
FILE *fp=fopen("C:/Users/12931/Desktop/abc1.txt","w");
//写入结构体
struct Student{
char name[10];
int age;
};
struct Student xw1={"小红",20};
fwrite(&xw1,sizeof(struct Student),1,fp);
fclose(fp);
return 0;
}
读取数据:
int main(int argc, const char * argv[]) {
//打开文件
//fopen("abc.txt",const char *restrict __mode) ;
FILE *fp=fopen("C:/Users/12931/Desktop/abc1.txt","r");
//写入结构体
struct Student{
char name[10];
int age;
};
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语言的精髓所在,动态分配内存更是让我大开眼界 感觉牛逼的亚子,当然,指针的确比较难,有好多地方像是在读无字天书,就是懂不了,链表更是听的云里雾里,似懂非懂的。感觉自己不懂的还有好多,不过今天也学习了好多指针、结构体、动态分配内存的基础知识,也算很有收获!
网友评论