指针
指针是变量,存放内存单元的地址。
int a=10; //在内存中开辟一块空间
int *p=&a; //对变量a取地址,变量a的地址存放在变量p中,此时p就是一个 指针变量
各个类型指针所占字节数
sizeof(char*); //4
sizeof(short*); //4
sizeof(int*); //4
sizeof(double*);//4
//=================
int a=0x11223344;
int *pa=&a;
char *pc=&a;
printf("%p\n",pa);//0061fec4
printf("%p\n",pc);//0061fec4
//==================
*pa=0;//在内存地址中显示:00 00 00 00
*pc=0;//在内存地址中显示:00 33 22 11
/*
指针类型决定了指针进行解引用时,访问空间大小
char* 类型解引用可以访问1 byte
int* 4 byte
double* 8 byte
*/
指针步长
//指针类型决定指针步长
char *cp; //cp+1 偏移 1 byte
int *ip; //ip+1 偏移 4 byte
double *dp;//dp+1 偏移 8 byte
数组首地址
int arr[5]={
0};
int *p=arr; //此时arr表示数组首元素地址 == &arr[0]
for(int i=0;i<5;i++){
*(p+1)=1; //讲数组中每个元素都置为1
}
野指针:指向的位置是不可知的
/*
避免野指针
1.初始化指针
2.小心指针越界
3.指针指向空间释放即置位NULL
*/
int* test(){
int a=10;
return &a;
}
void main(){
//调用完test之后a的地址空间将归还给系统,此时对该地址操作系统异常
int *p=test();
*p=20;
}
指针地址加、减
int values[5];
int *vp;
for(vp=&values[0];vp<&values[5];){
*vp++=0; //vp先与*结合将该值置位0,然后++
}
//数组中根据某两个元素地址,求元素之间个数
int arr[]={
1,2,3,4,5,6,7};
int len = &arr[6] - &arr[0]; //len=6
//求字符串长度
int len(const char *str){
char *begin = str;
char *end =str;
while(*end != '\0'){
end++;
}
return end - start;
}
//=======================
float v[5],*vp;
for(vp = &v[4];vp>&v[0]) *--vp=0;
for(vp = &v[4];vp