相信学习C语言的小伙伴都在指针这里碰过壁,指针也是大家熟知的几大难点之一,下面我们具体总结一下指针的知识点,带大家详细了解指针
指针的初阶
1. 指针是什么?
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向
(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以
说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址
的内存单元
那么我们可以这样理解:
指针是个变量,用来存放内存单元的地址
那么对应到代码:
#include<stdio.h>
int main()
{
int a = 0;//在内存中开辟一处空间
int* p = &a;//取出a变量的地址放在p变量中
//p变量就是一个指针变量
return 0;
}
总结:指针就是变量,用来存放地址的变量,指针的大小在32位平台上是4个字节,在64位平台上是8个字节。
2.指针和指针类型
#include<stdio.h>
int main()
{
char* pc = NULL;
int* pi = NULL;
short* ps = NULL;
long* pl = NULL;
float* pf = NULL;
double* pd = NULL;
return 0;
}
指针+-整数
#include<stdio.h>
int main()
{
int n = 10;
char* pc = (char*)&n;
int* pi == &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc + 1);
printf("%p\n", pi);
printf("%p\n", pi + 1);
return 0;
}
总结: 指针的类型决定了指针向前或者向后走一步有多大(距离)。
指针的解引用
#include<stdio.h>
int main()
{
int n = 0x11223344;
char* pc = (char*)&n;
int* pi = &n;
*pc= 0;//观察调试过程中内存的变化
*pi = 0;//观察调试过程中内存的变化
return 0;
}
总结 :指针的类型决定了对指针解引用的时候能操作几个字节。
3.野指针
野指针成因
1.指针未初始化
#include<stdio.h>
int main()
{
int* p;//局部变量指针未初始化
*p = 20;
return 0;
}
2.指针越界访问
#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.指针指向空间释放即使置NULL
4.指针使用之前检查有效性
#include<stdio.h>
int main()
{
int* p = NULL;
int a = 10;
p = &a;
if(p != NULL)
{
*p = 20;
}
return 0;
}
4. 指针与数组
数组名是什么?
数组名表示的是数组首元素地址
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
通过指针来访问数组
arr[i] --> *(p + i)
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
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;
}
5.二级指针
指针变量的地址的存放
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
return 0;
}
6.指针数组
指针数组是存放指针的数组
int* arr[5]
指针的进阶
1.字符指针
一般使用方式
#include<stdio.h>
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'w';
return 0;
}
另一种方式
#include<stdio.h>
int main()
{
char* pstr = "hello world";
printf("%s\n", pstr);
return 0;
}
2.数组指针
数组指针格式
int (*p)[5]
*和p结合说明p是一个指针变量,然后指向的是一个大小为5 的整型数组
所以p是一个指针变量,指向一个数组,叫数组指针
&数组名 和 数组名的区别
int arr = 10;
arr表示的是数组首元素的地址
&arr表示的是整个数组的地址,而不是数组首元素的地址
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr);
printf("%p\n", arr + 1);
printf("%p\n", &arr + 1);
return 0;
}
3.函数指针
#include<stdio.h>
int add(int a, int b)
{
return a + b;
}
void test(int (*p)(int, int))//函数指针
{
}
int main()
{
int a = 10;
int b = 20;
add(a, b);
test(add);
return 0;
}
以上即为 C语言指针大部分内容详解,感谢大家观看