可以看成存储地址的变量,地址可以指向是函数和基本类型。
数据都要通过地址来查找获取横好理解,不同编程语言的区别就是在代码层面有没有可以主动使用还是交给编译器完成。
变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址
type *var-name;
type 是指针的基类型(即指向变量的类型),var-name 是指针变量的名称,星号是用来指定一个变量是指针
int *ip; /* 一个整型的指针 */ double *dp; /* 一个 double 型的指针 */ float *fp; /* 一个浮点型的指针 */ char *ch; /* 一个字符型的指针 */
例子:
#include <stdio.h> int main () { int var_runoob = 10; int *p; // 定义指针变量 p = &var_runoob; printf("var_runoob 变量的地址: %p\n", p); return 0; } 执行后: var_runoob 变量的地址: 0x7ffeeaae08d8
定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。通过 * 来获取指定地址的变量的值。
实例:
#include <stdio.h> int main () { int var = 20; /* 实际变量的声明 */ int *ip; /* 指针变量的声明 */ ip = &var; /* 在指针变量中存储 var 的地址 */ printf("var 变量的地址: %p\n", &var ); /* 在指针变量中存储的地址 */ printf("ip 变量存储的地址: %p\n", ip ); /* 使用指针访问值 */ printf("*ip 变量的值: %d\n", *ip ); return 0; }
执行结果:
var 变量的地址: 0x7ffeeef168d8 ip 变量存储的地址: 0x7ffeeef168d8 *ip 变量的值: 20
赋为 NULL 值的指针被称为空指针, 空指针并非没有指向的地址, 而是这个值是0. 如果没有确切的地址可以赋值, 为指针变量赋一个 NULL 值是一个良好的编程习惯。 大多数的操作系统上,程序不允许访问地址为 0 的内存, 因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义, 它表明该指针不指向一个可访问的内存位置。 但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
例子:
#include <stdio.h> int main () { int *ptr = NULL; printf("ptr 的地址是 %p\n", ptr ); return 0; } 执行结果: ptr 的地址是 0x0
实际上空指针说的是指针变量没有指向具体的一个基本类型。而是指针没有值(默认0)。
因此指针可以直接参与逻辑运算:
if(ptr) /* 如果 p 非空,则完成 */ if(!ptr) /* 如果 p 为空,则完成 */
数组指针函数指针。
单独的函数名称和数组名称代表各自的指针。