指针
什么是指针
在计算机中所有数据都存储在内存单元中,而每个内存单元都有一个对应的地址, 只要通过这个地址就能找到对应单元中存储的数据. 由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”
内存单元的指针(地址)和内存单元的内容是两个不同的概念。
指针变量
什么是指针变量
- 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是
某个内存单元的地址或称为某内存单元的指针。 - 严格意义上说,指针是一个地址,是一个常量
- 针变量是存放一个地址,是一个变量。
定义指针变量
- 格式
- 数据类型 * 变量名称
- 数据类型:说明将来指针变量能够保存什么类型的变量的地址
-
- 仅仅为了标识这是指针变量
- 只要一个指针变量保存了一个变量的地址,那么我们就说这个指针变量指向了那个变量
int number = 10;
//定义指针变量
//表示将number的地址存储到num指针变量中
int *num = &number;
- 内存
- 指针在64位的编译器中占8个字节的内存空间
- 指针变量前用* 代表访问指针变量指向的那一块存储空间
int number = 10;
//定义指针变量
//表示将number的地址存储到num指针变量中
int *p = &number;
//访问指针P所指向的内存空间
*p = 5;
printf("%i",number);
- 通过指针操作一个变量的值
#include <stdio.h>
void change(int*);
int main(int argc, const char * argv[]) {
/*
int number = 10;
//定义指针变量
//表示将number的地址存储到num指针变量中
int *p = &number;
//访问指针P所指向的内存空间
*p = 5;
printf("%i",number);
*/
int number = 5;
change(&number);
printf("%i",number);
return 0;
}
void change(int *p){
*p = 20;
}
- 通过指针交换两个变量的值
#include <stdio.h>
void changeNumber(int*,int*);
int main(int argc, const char * argv[]) {
int a = 10;
int b = 5;
changeNumber(&a, &b);
printf("a = %i,b= %i\n",a,b);
return 0;
}
void changeNumber(int* v1,int* v2){
int temp = *v1;
*v1 = *v2;
*v2 = temp;
}
- 通过操作指针同时处理多个变量
#include <stdio.h>
int calculate(int,int,int,int*,int*);
int main(int argc, const char * argv[]) {
int a = 10;
int b = 20;
int c = 30;
//求和
int sum =0;
int dValue = 0;
int average =calculate(a, b, c, &sum, &dValue);
printf("求和 %i,求差 %i,平均值 %i\n",sum,dValue,average);
return 0;
}
int calculate(int v1,int v2,int v3,int* p1,int* p2){
//定义p1指向的内存空间
*p1 = v1+v2+v3;
//操作p2指向的内存空间
*p2 = v1-v2-v3;
//返回平均值
return (v1+v2+v3)/3;
}
指针注意点
- 指针只能保存地址
- 同一个变量可以有多个指针指向它
- 指针的指向可以修改
- 不要访问空指针或者野指针
多级指针
- 多级指针代表指向指针的指针
- 多级指针为多个指针的嵌套
~~ char c = 'a';
~~ char *cp;
~~ cp = &c;
~~ char **cp2;
~~ cp2 = &cp;
~~ printf("c = %c", **cp2);
指针类型
1.指针为什么要区分类型
在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境 下,任何一个指针变量都只占用8个字节,并不会随所指向变量的类型而改变。
虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。
- 一个int占用4个字节,一个char占用1个字节,而一个double占用8字节;
- 现在只有一个地址,我怎么才能知道要从这个地址开始向后访问多少个字节的存储空间呢,是4个,是1个,还是8个。
- 所以指针变量需要它所指向的数据类型告诉它要访问多少个字节存储空间
- 当我们利用指针去取值的时候,系统就会自动根据指针的类型来确定应该取多少个字节中的值
- 通俗点说就是指针类型取值的时候需要通过指针类型取值的时候去指定指针取多少值,如果指针类型不匹配就会产生取值的错误。