跟着鹏哥学编程,拿一个好offer。
今天来总结一下最近学习的指针方面的知识,以方便自己以后回顾。
一.什么是指针?指针就是内存地址。在计算机内存中,我们定义一个变量,计算机就会给该变量分配一个内存空间,这个内存空间可以取出来给指针,如下:
#include <stdio.h>
int main()
{
int a = 10;//定义一个变量a
int* pa = &a;//&是一个取地址符,将a的地址取出来赋给指针变量pa
//变量pa类型是int*,说明变量pa指向变量类型是int
return 0;
}
指针类型决定了两件事情:
1.指针类型决定了指针进行解引用操作的时候,能访问空间的大小
#include <stdio.h>
int main()
{
//NULL(空指针) - 用来初始化指针的,给指针赋值的
int* a = NULL;//指向整型的指针,能访问的空间大小是4个字节
char* b = NULL;//指向字符型的指针,能访问的空间大小是1个字节
double* c = NULL;//指向双精度浮点型的指针,能访问的空间大小是8个字节
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(double*));
}
指针大小都是4或8个字节,在32位平台上是4个字节,在64位平台上就是8个字节。
2.指针类型决定了指针走一步走多远(指针的步长)
#include <stdio.h>
int main()
{
int a=10;
int* pa = &a;
printf("%p\n",pa);
printf("%p\n",pa+1);
char str = 'a';
char* s = &str;
printf("%p\n",s);
printf("%p\n",s+1);
return 0;
}
二.野指针
野指针是指针指向内存空间是未可知的,野指针有三种情况如下:
1.指针未定义
#include <stdio.h>
int main()
{
//未初始化的指针变量
int* p;//局部变量不初始化,里边默认放的是一个随机值
*p = 20;
return 0;
}
2.指针越界访问
#include <stdio.h>
int main()
{
int arr[10] = {0};
int i = 0;
int* p = arr;
for(i=0;i<=12;i++)//数组越界导致的野指针
{
*p=i;
p++;
}
return 0;
}
3.指针指向空间内存被释放
#include <stdio.h>
int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();
*p = 20;
printf("%p\n",p);
printf("%p",*p);
return 0;
}
三.指针运算
1.指针加减整数
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = &arr[9];
for (i = 0; i < sz; i++)
{
printf("%d ",*p);
p = p-1;
}
return 0;
}
2.指针是可以比较大小的
#include <stdio.h>
int main()
{
int arr[5] = { 0 };
int* pa = arr;
for (pa = arr;pa<=&arr[4];)
{
*pa = 0;
pa++;
}
for (int i = 0; i < 5; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
四.二级指针
#include <stdio.h>
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;//二级指针
printf("%d\n",**ppa);
return 0;
}
#include <stdio.h>
//指针数组 - 数组 - 存放指针的数组
//数组指针 - 指针
int main()
{
int a = 10; int b = 15;
int c = 11;
int* arr[3] = { &a,&b,&c };//指针数组
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d ",(*arr[i]));
}
return 0;
}
目前就学到这些,日后有新东西会更新。