一、指針複習
地址就是內存單元的編號從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()進行釋放,否則會發生內存泄露,內存越用越少