1.指针的基本介绍
- 指针,也就是内存的地址;所谓指针变量,也就是保存了内存地址的变量
- 获取变量的地址,用&。例如:&num
- 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值。比如:int *ptr = # ptr 就是指向 int 类型的指针变量, 即 ptr 是 int * 类型。
- 获取指针类型所指向的值,使用:*(取值符号),比如:int * ptr , 使用*ptr 获取 ptr 指向的值
2.什么是指针
指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为
int *ip;/* 一个整型的指针 */ double *dp;/* 一个 double 型的指针 */ float *fp;/* 一个浮点型的指针 */ char *ch;/* 一个字符型的指针 */
3.指针的算术运算
指针是一个用数值表示的地址。可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-
3.1.指针递增操作(++)
#include<stdio.h> void main() { int arr[3] = { 10, 100, 1000 }, i = 0; int* ptr = arr; for (i = 0; i < 3; i++) { printf("数组%d的地址为:%p\n", i, ptr); printf("数组%d的内容为:%d\n", i, *ptr); ptr++;//在int类型中,基本单位为4byte,因此ptr++实际上是+4,指向下一个数组 } }
因为数组是在内存空间中是连续的,因此对指向数组空间的指针变量进行++(或者--)操作的时候,实际上是+(或者-)一个指针类型的单位大小的byte(例如:int为4byte,double为8byte),因此,它就会指向下一个(或者上一个)数组元素
3.2.指针递减操作
#include<stdio.h> void main() { int arr[3] = { 10, 100, 1000 }, i = 0; int* ptr = &arr[2]; for (i = 2; i >= 0; i--) { printf("数组%d的地址为:%p\n", i, ptr); printf("数组%d的内容为:%d\n", i, *ptr); ptr--;//在int类型中,基本单位为4byte,因此ptr--实际上是-4,指向上一个数组元素 } }
3.3.指针+操作
#include<stdio.h> void main() { int arr[3] = { 10, 100, 1000 }, i = 0; int* ptr = arr; ptr += 1;//在int类型中,基本单位为4byte,因此ptr--实际上是-4,指向上一个数组元素 printf("数组%d的地址为:%p\n", i, ptr); printf("数组%d的内容为:%d\n", i, *ptr); }
指针+(或-)操作,与指针++(或--)操作同理,只是它更能快速的定位到你想要的数组元素
3.4.指针-操作
#include<stdio.h> void main() { int arr[3] = { 10, 100, 1000 }, i = 0; int* ptr = &arr[2]; ptr -= 1;//在int类型中,基本单位为4byte,因此ptr--实际上是-4,指向上一个数组元素 printf("数组%d的地址为:%p\n", i, ptr); printf("数组%d的内容为:%d\n", i, *ptr); }
4.指针的比较
指针可以用关系运算符进行比较,如 ==、<、 <= 和 > 、>=。如果 p1 和 p2 指向两个变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较
#include<stdio.h> void main() { int i = 0, arr[3] = { 10, 100, 100 }; int* ptr = arr; //判断指针变量ptr内容,即其所指向的内存空间的地址 //是否小于等于数组arr中第二个元素的地址 //如果是,则进行printf while (ptr <= &arr[1]) { printf("arr[%d]的地址为:%p\tarr[%d]的内容为%d\n", i, ptr, i, *ptr); ptr++; i++; } }