地址和指针的概念
如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元
- 内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
- 在地址所标识的内存单元中存放数据,这相当于馆房间中居住的旅客-样。
- 由于通过地址能找到所需的变量单元,我们可以用地址指向该变量单元,将地址形象化地称为“指针”。
为了表示将数值3送到变量 i 中,可以有两种表达方法:
- 1.直接存取
例如:
i=3;
- 2.间接存取
- 例如:
*i_ad=3;
其中*i_ad
表示i_ad
指向的对象
- 假设 i_ad 中的值是变量 i 的地址(2000),这样就在 i_ad 和变量 i 之间建立起一种联系,即
通过 i_ad 能知道 i 的地址,从而找到变量 i 的内存单元。 - 由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元将地址形象化地称为“指针”,
即通过它能找到以它为地址的内存单元。 一个变量的地址称为该变量的“指针”
- 例如:地址2000 是 变量 i 的指针
如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”,
指针变量就是地址变量,用来存放地址的变量,指针变量的值是地址(即指针)。- 例如:i_ad 就是一个指针变量
指针变量的定义
一般形式为:
类型
*指针变量名;
例如:
int *addr_a, *addr_b;
- int 是为指针变量指定的 “基类型”
- 基类型指定指针变量可指向的变量类型
如 addr_a 可以指向整型变量,但不能指向浮点型变量
注意:
*addr_a = &a;错误的addr_a = &a;
正确的- float *addr_f;
addr_f = &a;错误的,a 为int类型,addr_f 为float类型
- 例子
通过指针变量访问整型变量。
#include <stdio.h>
void main() {
int a = 10, b = 100;
int *addr_a, *addr_b; // 定义指针变量
addr_a = &a; // 使addr_a指同a
addr_b = &b; // 使addr_b指同b
printf("a = %d, b = %d\n", a, b); // 直接输出 a,b的值
printf("addr_a = %d, addr_b = %d\n", *addr_a, *addr_b); // 间接输出 a,b的值
}
指针变量的引用
在引用指针变量时,可能有三种情况:
- 1.给指针变量赋值。
- 例如:
p = &a;
- 2.引用指针变量指向的变量。
- 例如:
p = &a;
*p = 1;
引用指针变量的值
- 例如:
printf("%o", p);
以八进制输出a的地址
- 例如:
& 取地址运算符
- &a 是变量 a 的地址
* 指针运算符 (“间接访问”运算符)
- 例如: p 指向变量 a, 则 *p 就代表 a
- 例子
#include <stdio.h>
void main() {
int a,b,c,d,e,*p;
a = 100;
p = &a;
b = *&a;
printf("a=%d\n", a);
printf("p=%d\n", p);
printf("*p=%d\n", *p);
printf("*&a=%d\n", b);
c = (*p)++;
printf("(*p)++ = %d\n", c);
printf("a = %d\n",a);
}
#include <stdio.h>
void main() {
int m, n, *p1 = &m, *p2 = &n, *phint = NULL;
m = n = 6;
printf("m=%d,n=%d\n", m, n);
printf("*p1=%d,*p2=%d\n", *p1, *p2);
printf("p1=%d,p2=%d\n", p1, p2);
printf("phint=%d\n", phint);
}
#include <stdio.h>
void main() {
int m, n, *p1 = &m, *p2 = &n, *phint = NULL;
m = n = 6;
*p1 += 3;
p2 = p1;
*p2*=4;
phint = p2;
printf("*p1=%d,*p2=%d\n", *p1, *p2);
printf("p1=%d,p2=%d\n", p1, p2);
printf("m=%d,n=%d\n", m, n);
printf("phint=%d\n", phint);
printf("*phint=%d\n", *phint);
}
评论