热门
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
#include <stdio.h> int main() { int *p;//局部变量指针未初始化,默认为随机值 *p = 20; return 0; }
#include <stdio.h> int main() { int arr[10] = {0}; int *p = arr; int i = 0; for(i=0; i<=11; i++) { //当指针指向的范围超出数组arr的范围时,p就是野指针 *(p++) = i; } return 0; }
1. 指针初始化2. 小心指针越界3. 指针指向空间释放,及时置NULL4. 避免返回局部变量的地址5. 指针使用之前检查有效性
第三种情况的使用例子
#include <stdio.h> int main() { int *p = NULL;//在使用前先把指针置空防止为释放指针之前指向的空间 //.... int a = 10; p = &a; if(p != NULL) { *p = 20; } return 0; }
#define m 5 float values[m]; float* vp; //指针+-整数;指针的关系运算 for (vp = &values[0]; vp < &values[m];) { *vp++ = 0;//把values数组中每个元素都初始化为0,这里指针++表示地址后移 }
//计算字符串的长度 int my_strlen(char *s) { char *p = s; while(*p != '\0' ) p++; return p-s;//当p中读取到\0时说明该字符串总长度为此时的地址p-首元素地址s }
for(vp = &values[m]; vp > &values[0];) { *--vp = 0;//由于是前置--,最后会与第一元素之前的元素比较 }
for(vp = &values[m-1]; vp >= &values[0];vp--) { *vp = 0; }
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,0}; printf("%p\n", arr);//打印地址 printf("%p\n", &arr[0]); return 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,0}; int *p = arr;//p存放的是数组首元素的地址
#include <stdio.h> int main() { int arr[] = {1,2,3,4,5,6,7,8,9,0}; int *p = arr; //指针存放数组首元素的地址 int sz = sizeof(arr)/sizeof(arr[0]); int i; for(i=0; i<sz; i++) { printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p+i); } return 0; }
int main() { int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; int *p = arr; //指针存放数组首元素的地址 int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; for (i = 0; i<sz; i++) { printf("%d ", *(p + i)); } return 0; }
int main() { int a = 10; int* p = &a; int** pa = &p; printf("%d\n", a); printf("%d\n", *p); printf("%d\n", **pa); return 0; }
//*pa通过对pa中的地址进行解引用,这样找到的是p ,*pa 其实访问的就是p . int b = 20; *pa = &b;//等价于 p = &b;
//**pa 先通过* pa 找到 p, 然后对 p 进行解引用操作:*p ,那找到的是 a . **pa = 30; //等价于*p = 30; //等价于a = 30;
数组我们已经知道整形数组,字符数组。
int arr1[5]; char arr2[6];
int* arr3[5];//是什么?
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**