指针(pointer)
指针是一个值为内存地址的 变量 (或数据对象)
变量就是一块内存地址
int year;
year = 2016;
分配内存空间; 空间内容为 2016; 内存地址(0028FF44)一般使用16进制数字表示
int * ptr_year;
ptr_year = &year;
创建指针变量, 但这个变量的内存空间中 存放的 是 地址
prt_year 指针变量 指向了 year 变量
基本用法
数据类型 * 指针变量名;
eg.
int * ptr_num;
double * p_price;
int * prt_num = NULL;
- 在头文件<stdio.h>中, NULL被定义为常量
- int * prt_num = NULL; 指针的初始值为空, 表示指针不指向任何地址
取地址符 &
&是取地址
int num = 1024;
int * prt_num;
//取num变量的地址赋给 ptr_num
prt_num = #
%s, %d, %f, %x(16进制占位符), %p(打印指针类型数据)
间接运算符 *
*是取值
int num =1024;
int * ptr_num;
ptr_num = #
*ptr_num = 1111; //把 1111 赋值给空间 prt_num
总结
int num = 10;
int * ptr_num;
ptr_num = # //用&给指针赋值
*ptr_num //显示指针所指的值
int * ptr_num2;
ptr_num2 = ptr_num; //让num2指针指向 和 一号指针一样的地址
- ptr_num2 = 99; // ==num = 99, 通过二号指针给 被指变量赋值
#include <stdio.h>
int main() {
int num = 1024; //整形变量
int * ptr_num; //整型指针变量
ptr_num = # //取num的地址 赋值给ptr_num变量
printf("1.num的值为:%d\n", num); //整型变量值
printf("2.num的内存地址为:%p\n", &num); //整形变量的内存地址
printf("3.ptr_num的值为:%p\n", ptr_num); //指针变量的值, 就是整型变量的内存地址
printf("4.ptr_num的内存地址为:%p\n", &ptr_num); //指针变量的内存地址
printf("5.*ptr_num指向的值为:%d\n", *ptr_num); //指针变量指向的值
}
变量 | 值 | 内存 | 指向 |
---|---|---|---|
num | 5 | 0x7ffeefbff4dc | N/A |
ptr_num | 0x7ffeefbff4dc | 0x7ffeefbff4d0 | 5 |
指针使用示例
#include <stdio.h>
int main() {
int num1 = 1024;
int num2 = 2048;
int * ptr1, * ptr2;
ptr1 = &num1;
ptr2 = &num2;
printf("num1的值是:%d\tnum1的地址是:%p\n", num1, ptr1);
printf("num2的值是:%d\tnum2的地址是:%p\n", num2, ptr2);
//ptr 2 = ptr 1 //两个变量指向同一块内存
*ptr2 = *ptr1; //效果等于 num2 = num1, 地址不换,换值
printf("重新赋值后:\n");
printf("num2的值是%d\tnum2的地址是:%p\n", num2, ptr2);
}
总结
指针 存储着另一个对象的地址; 就像是名片
指针变量可以赋值
- 指针变量的命名规则和其他变量一样
- 不能重名
- 可存放任何基本数据类型
- 若指针已经声明类型, 则只能赋某种类型地址
真真在某时刻可以指向变量x, 另一个时刻可以指向变量y