一、指针复习
地址就是内存单元的编号从0开始的非负整数
范围:0--FFFFFFFF[0-4G-1](地址线是32位,刚好控制2的32次)
指针:
指针就是地址 地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数(不能加乘除,只能加减)
指针分类:
1、基本类型的指针
#include<stdio.h>
void f(int * i){ //定义一个int *类型的指针变量i
*i=100; //i用来存放int类型变量的地址
}
int main(){
int i=10;
f(&i);
printf("i=%d",i);
return 0;
}
2、指针和数组的关系
#include<stdio.h>
int i;
void f(int * p,int len){
for(i=0;i<len;i++){
*(p+i)=-1; //等同于*(a+i)等同于a[i]
}
}
int main(){
int a[5]={0,1,2,3,4};
f(a,3);
printf("%d",0[a]);
return 0;
}
3、指针和结构体的关系(C++中用类也能实现)
#include<stdio.h>
struct Student{
int sid;
char name[200];
int age;
};
void f(struct Student * p){
printf("p-> =%d,%s,%d \n",p->sid,p->name,p->age);
printf("*p=%d,%s,%d \n",(*p).sid,(*p).name,(*p).age);
}
int main(){
struct Student st={1000,"zhangsan",18};
printf("st=%d,%s,%d \n",st.sid,st.name,st.age);
f(&st);
}
什么叫结构体
使用结构体的两种方式:
1.struct Student st = {1000, "zhangsan", 20}
2.struct Student * pst = &st;
st.sid 等同于 pst->sid 等同于 (*pst).sid
pst所指向的结构体变量中的sid这个成员
注意事项:
结构体变量不能加减乘除,但可以相互赋值
普通结构体变量和结构体指针变量作为函数参数的传递
4.动态内存分配
#include<stdio.h>
#include<malloc.h>
int main(){
int i;
int len=5;
int * pArr=(int *)malloc(sizeof(int)*len);//malloc只需要一个参数,只能返回第一个字节的地址
*pArr=0;
*(pArr+1)=1;
pArr[2]=2;
*(pArr+3)=3;
4[pArr]=4;
for(i=0;i<5;i++){
printf("%d\n",pArr[i]);
}
free(pArr); //把pArr所代表的动态分配的内存释放
return 0;
}
动态分配的内存,必须通过手动调用free()进行释放,否则会发生内存泄露,内存越用越少