初阶指针
指针是什么?
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
指针是个存放内存单元的地址
#include<iostream>
int main() {
int a = 10;//内存中开辟一块空间
int* p = &a;//创建指针,取出它的地址,这里使用的是&
//将a的地址存放在p变量中p就是一个指针变量
return 0;
}
总结:指针就是变量用来存放地址的变量在32位中指针的大小是4个字节64位中大小是8个字节
指针的类型
指针的定义方式
type + *
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
char* 类型的指针是为了存放 char 类型变量的地址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放int 类型变量的地址。
#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;
}
不同类型的指针访问的字节数目不同,决定了指针向前后者向后走一大步或者一小步
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
野指针
概念:指针指向的位置是不可知的不明确的。
原因:
- 1.指针没有初始化
#include<stdio.h>
int main()
{
int *p;//指针没有初始化,默认为随机值。
*p=20;
return 0;
}
- 2.指针越界空间
#include<stdio.h>
int main()
{
itn arr[10]={0};
int *p=&arr;
for(int i=0;i<=11;i++)
{
*(p++)=i;
}
return 0;
}
避免野指针的方法
- 初始化指针
- 小心指针越界
- 指针指向空间释放即使置NULL
- 指针使用之前检查有效性
指针的运算
指针加减整数
#include<stdio.h>
int main() {
int arr[10];//内存中开辟一块空间
int* p = &arr[0];//创建指针,取出它的地址,这里使用的是&
//将a的地址存放在p变量中p就是一个指针变量
for (p = &arr[0]; p <= &arr[10];)
{
p++;
}
return 0;
}
指针减指针
int myfun(char *s)
{
char *p=s;
if(p!='\n')
{
p++;
}
return p-s;
}
- 注意:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
指针和数组之间的关系
#include<stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = &arr[0];
printf("%p\n", &arr);
printf("%p", &arr[0]);
}
由此可见数组名字和数组元素的第一个的地址是相同的,所以数组名存放的就是数组的首元素地址
int *p=arr;//就是首元素的地址
#include<stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = arr;
printf("%p\n", &arr);
printf("%p\n", &arr[0]);
int leng = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < leng; i++)
{
printf("arr[%d] + %p +p+%d + %p \n", i, &arr[i], i, p + i);
}
}
所以p+i就是数组arr[i]的下标地址这样玩吗就可以通过指针来访问数组
通过指针来访问数组
#include<stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = arr;
printf("%p\n", &arr);
printf("%p\n", &arr[0]);
int leng = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < leng; i++)
{
printf("%d\n", *(p + i));
}
}