指针初阶
-
指针和指针类型
-
指针是什么 ?
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
-
这里我们就明白:
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
总结.
指针是用来存放地址的,地址是唯一标示一块地址空间的。指针的大小在32位平台是4个字节,在64位平台是8个字节 -
指针类型的意义:
1.指针类型决定了:指针的解引用权限有多大
2.指针类型决定了:指针走一步,能走多长(步长)
int main(){ //指针类型决定解引用权限 int a = 0x11223344; //16进制,共4*8=32个bite位 int b = 0x11223344; // int* pa = a; //用int类型指针指向a ,int类型:4字节 char* pb = b; //用char类型指针指向b ,char类型,1字节 pa = 0; //a=00 00 00 00 pb = 0; //b=00 22 33 44 //因为char类型的引用权限只有1字节,因此只能修改b中的一个字节位 //指针类型决定指针步长 int arr[10] = {0}; int* p1 = arr; char* p2 = arr; printf("%p\n",p1); printf("%p\n",p2); //p1与p2相同都是输出arr的首元地址 printf("%p\n",p1+1); printf("%p\n",p2+1); //p1与p2不同,因为int会往前走4个字节,而char只往前走1个字节 return 0; }
-
-
野指针
野指针:指针的位置是不可变的
-
产生野指针的原因:
指针未初始化
指针越界访问
指针指向的空间已经被释放
-
如何让避免野指针
指针初始化(习惯),不知道指针指向多少可以默认指向null
int *p = NULL;
-
-
指针运算
-
指针± 整数
int a = 10; int* p = &a; printf("%d",*p+1);
-
指针- 指针
指针- 指针表示:指针之间的元素个数;
前提是:两个指针必须指向同一块空间
int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("%d",&arr[9]-&arr[0]); return 0; }
-
指针关系运算
int main(){ int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = &arr; for (; p < &arr[10];) { //指针的关系运算 printf("%d",*p); p++; } return 0; }
-
-
指针和数组
//指针和数组 int main() { int arr[5] = { 1,2,3,4,5 }; int* p = &arr; //数组名:数组首元素地址,因此p==arr,都是标志arr[0]的地址 //因此:arr[2]==*(arr+2)==*(p+2)==*(2+p)==*(2+arr)==2[arr]==p[2]==2[p] printf("%d\n", arr[2]); printf("%d\n", *(arr+2)); printf("%d\n", *(p+2)); printf("%d\n", *(2+p)); printf("%d\n", *(2+arr)); printf("%d\n", 2[arr]); printf("%d\n", p[2]); printf("%d\n", 2[p]); return 0; }
-
二级指针
int main() { int a = 10; int* pa = &a; int* * ppa = &pa;//其中第二个*表示:ppa是指针;第一个*表示ppa指向的对象是int*类型 printf("%d\n",a); printf("%d\n", *pa); printf("%d\n", **ppa); return 0; }
-
指针数组
用于存放指针的数组
int * paar[5];//整形指针数组 char* pch[5];//字符指针数组
暂时先知道有这个东西就行