目录 : 1.什么是指针
2.指针类型以及不同指针类型会产生什么误差
3.野指针
4.指针运算
5.指针和数组
6.二级指针
7.指针数组
前言:指针作为C语言最重要的一个知识点,希望将它理解并且运用到代码中.
1 .指针的概念 :书上过于专业化 ----通俗理解为指针就是地址. 指针变量就是存放地址的变量.
指针在32平台上是占4B(字节) , 在64平台上占位8B(字节) .
eg : int *p=&a; //&表示取地址符 ,取出为一个地址 .所以指针可以想象成是地址.
2.指针类型 : 决定了进行解引用操作能够访问空间的大小.
eg : int *p ==>访问4个B
char *p ==>访问1个B
double *p ==>访问8个B
指针类型决定了指针走一步走多远(指针步长).
eg : int *p+1 ==>向右移动4B.
3.野指针 : 指向的位置不可知,指向空间是非法的.
野指针有以下情况 : (1).指针未初始化,这样导致指针存放随机值. int *p;//未初始化
(2).指针访问越界,在数组中 int a[5], int *p=&a[5]; // 越界
(3).指针指向内存空间已经被释放了. 当函数被调用后,局部变量就被释放.
4.指针运算 : (1).指针+-整数
(2).指针-指针
1.指针+-整数:
#include<stdio.h>
#define PI 5
int main()
{
float value[PI];
float *p;
for(p=&value[0];p<&value[PI];)
{
*p++=0; //指针++
}
return 0;
}
2.指针-指针: 是指针与指针之间的元素值,并不是数组哦!!
#include<stdio.h>
int main()
{
int arr[9]={1,2,3,4,5,6,7,8,9};
char a[5]={0}; //其中其他数值默认为0;
printf("%d\n",&arr[8]-&arr[0]); //求出中间元素的个数
printf("%d\n",&arr[5]-&a[0]); //error 因为只能在同一个内存空间中才可以减,同一个数组中
return 0;
}
5.指针和数组 :
eg : int arr[10];
arr--数组名为首元素地址;
&arr---取出整个数组的地址;
sizeof(arr)---计算整个数组大小;
&arr+1---跳过一个整数组.
#include<stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,0};
int *p=arr; //数组的首地址
int sz=sizeof(arr); //整个数组大小
for(int i=0;i<sz;i++)
{
printf("%d\n",*(p+i)); //*(p+i)进行解引用操作
}
return 0;
}
6.二级指针 :
int *p=&a;///表示一级指针;
int **pp1=&p; //表示二级指针;以此类推还有三级指针,n级指针.
7.指针数组 : 重点在数组,表示存放指针的数组.
#include<stdio.h>
int main()
{
int a=1;
int b=2;
int c=3;
int *arr[3]={&a,&b,&c}; //指针数组 ,存放指针(地址)
return 0;
}
eg : int *arr[3]={&a,&b,&c}
数组指针---则表示指针;
类推为 整型数组,字符型数组.
--坚持IT工作者!!!