1.一个内存单元占一个字节
2.指针是个变量,用来存放内存单元的地址
3.int* p = &a; //p就是指针变量
4.在32位机器上,指针变量占4个字节。64位机器上,占8个字节
二、1.不管指针类型是什么,指针变量的大小都是4个字节或8个字节。那指针还分类型做什么呢?
2.指针类型是为了指明指针进行解引用 *** 作时,可访问空间的大小(可以访问几个字节)
int* p; //可以访问4个字节
char* p; //可以访问1个字节
double* p; //可以访问8个字节
3.指针类型决定了指针+1或-1时,向后或向前移几个字节(指针的步长)
int* p;
p+1; //p向后移四个字节
4.野指针:指针指向的位置是不可知的,随机的。
5.可能导致指针变野指针的情况:
① 局部指针变量不初始化,会导致指针变成野指针:int* p;
② 指针越界访问
③ 指针指向的内存空间被释放后,指针就会变成野指针
三、int* fun()
{
int a = 10;
return &a;
}
int* p = fun(); //这里a的内存已经被释放了,p其实已经是野指针了。
*p = 20;
1.指针的运算:
① 指针+-整数
② 指针-指针:得到的是两指针中间的元素个数,小地址-大地址得到的是负数。注意:一般是同一块空间的地址相减,比如同一个数组。
求字符串长度
int Mystrlen(char* str)
{
//start指针指向首元素的地址
char* start = str;
//利用循环使end指针指向最后一个元素,也就是结束标志符
char* end = str;
while(*end != '\0')
{
end++;
}
//返回指针间的元素个数,也就是字符串的长度
return end - start;
}
*--p = 0; //先算--,再算*p = 0
2.在用指针写for循环条件时,应注意不要用第一个元素之前的地址来比较(p不要和p3比较),但可以用最后一个元素之后的地址比较(p1可以和p2比较)。
四、1.通常数组名是首元素的地址,但是:
①&arr,数组名表示整个数组的地址。&数组名,取出的是整个数组的地址
②sizeof(arr),数组名表示整个数组。sizeof(数组名),计算的是整个数组的大小
2.二级指针
int a = 10;
int* pa = &a;
int** ppa = *pa; //ppa就是二级指针,ppa的类型是int**,其中int*表示ppa指向的是int*类型的变量,*表示ppa是指针
**ppa = 20; //等价于*pa = 20; a = 20;
3.指针数组和数组指针
① 指针数组 - 本质还是数组,是存放指针的数组,数组元素都是指针
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = {&a, &b, &c}; //指针数组arr,将abc三个变量的地址放入数组里
*(arr[0]) = 20; //等价于a = 20;
② 数组指针 - 本质还是指针
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)