指针相关理解
基本介绍
- 指针是C语言的精华, 也是C语言的难点。
- 指针, 也就是内存的地址; 所谓指针变量, 也就是保存了内存地址的变量。 关于指针的基本使用, 在讲变量的时候做了入门级的介绍
- 获取变量的地址, 用&, 比如:
int num = 10
, 获取num的地址:&num
- 指针类型, 指针变量存的是一个地址, 这个地址指向的空间存的才是值比如:
int *ptr = & ptr
就是指向 int 类型的指针变量, 即 ptr 是 int * 类型。 - 获取指针类型所指向的值, 使用: (取值符号), 比如:
int * ptr
, 使用ptr获取ptr指向的值
什么是指针
指针是一个变量,其值为另一个变量的地址(前示意图已经说明), 即,内存位置的直接地址。就像其他变量或常量一样,在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
指针的算术运算
指针是一个用数值表示的地址。 可以对指针执行算术运算。 可以对指针进行四种算术运算: ++
、 --
、 +
、 -
。
测试案例1.
//@author:five-five
#include "stdio.h"
int main() {
int nums[] = {1, 2, 3, 4};
int *point01 = (int *) &nums;
printf("-----------------------int`s point test starting----------------------------\n");
printf("%p\n", point01);
printf("%p\n", ++point01);
printf("%i\n", *point01);
printf("%i\n", *++point01);
return 0;
}
结论:
- 数组在内存中是连续分布的
- 当对指针进行
++
时, 指针会按照它指向的数据类型字节数大小增加, 比如 int *指针, 每++ , 就增加4个字节(win10)
测试案例2.
int main () {
int var[] = {10, 100, 200};
int i, *ptr;
ptr = var;
ptr += 2; //直接加2*sizeof(int)个字节
printf("var[2]=%d var[2]的地址=%p ptr=%p ptr指向的地址的内容=%d",
var[2], &var[2], ptr, *ptr);
return 0;
}
int main ()
{
int var[] = {10, 100, 200, 400, 9, 12};
int i, *ptr;
ptr = &var[2]; // ptr 指向了 第3个元素
ptr -= 2;
printf("ptr指向的值=%d", *ptr); // 10
return 0;
}
指针的比较
//@author:five-five
#include "stdio.h"
int main() {
int var[]={10, 100, 200};
int *ptr;
ptr = var;//ptr 指向var 首地址(第一个元素)
if(ptr == var[0]) {//错误,类型不一样
printf("ok1");
}
//指针进行比较
if(ptr == &var[0]) {// 可以
printf("\nok2"); //输出
}
//数组的地址是首位元素的地址
if(ptr == var) {//可以
printf("\nok3"); //输出
}
if(ptr >= &var[1]) {//可以比较,但是返回false
printf("\nok4");//不会输出
}
return 0;
}
//@author:five-five
#include "stdio.h"
const int MAX = 3;
int main() {
int var[] = {10, 100, 200};
int i, *ptr;
ptr = var;
i = 0;
while (ptr <= &var[MAX - 2])//&var[1]
{
printf("Address of var[%d] = %x\n", i, ptr);
printf("Value of var[%d] = %d\n", i, *ptr);
ptr++;
i++;
} //会输出 10 , 100
return 0;
}
指向指针的指针(多重指针)
多重指针介绍
- 一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向
int
类型指针的指针:int **ptr; // ptr 的类型是 int **
- 当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符, 比如
**ptr
代码示例
#include "stdio.h"
int main() {
int var;
int *ptr;//一级指针
int **pptr;//二级指针
int ***ppptr;//三级指针
var = 3000;
ptr = &var;//var 变量的地址赋给 ptr
pptr = &ptr;//ptr 变量的地址赋给 pptr
ppptr = &pptr;//pptr 变量的地址赋给 ppptr
printf("var的值:\t%i\n", var);
printf("var的指针:\t%p\n", &var);
printf("prt的指针:\t%p\n", &ptr);
printf("prt的指向指针:\t%p\n", ptr);
printf("pprt的指针:\t%p\n", &pptr);
printf("pprt的指向指针:\t%p\n", pptr);
printf("ppprt的指针:\t%p\n", &ppptr);
printf("ppprt的指向指针:\t%p\n", ppptr);
return 0;
}
结果如图
指针使用注意事项和细节
变量定义 | 类型表示 | 含义 |
---|---|---|
int i | int | 定义整型变量 |
int *p | int * | 定义p为指向整型数据的指针变量 |
int a[5] | int [5] | 定义整型数组a,它有5个元素 |
int * p[4] | int * [4] | 定义指针数组p,它有4个指向整型数据的指针元素组成 |
int(* p)[4] | int( * )[4] | p为指向包含4个元素的一维数组的指针变量 |
int f() | int() | f为返回整型函数值的函数 |
int *p() | int *() | p为返回一个指针的函数,该指针指向整型数据 |
int (* p)() | int (*)() | p为指向函数的指针,该函数返回一个整型 |
int **p | int ** | p是一个指针变量,它指向一个指向整型数据的指针变量 |
void *p | void * | p是一个指针变量,其类型为void(空类型),不指向具体的对象 |