目录
1.指针介绍
1.什么是指针?
计算机中所有数据都存储在内存当中,不同类型的数据占用的字节数不一样,为了正确的访问到这些存储在内存上的数据,必须为每个字节编上号码,确定标号是唯一的,这样我们就可以根据标号找到相对应的内存。我们将内存中字节的编号称为地址或指针。
地址是从0开始依次递增的。对于32位操作系统的环境,程序能使用的内存为4G。
最小的地址为0x0000 0000,最大的地址为0xFFFF FFFF
低地址 高地址
指针的表示:在变量前加*号来表示
实例:
int main() {
int* p, s; //p是整型指针变量,s是整型变量
char* pa, * pb; //pa和pb都是char型指针变量
int a = 10;
int* ip; //未初始化的指针,不良的定义习惯
ip = &a; //与int *p = &a; 等价
return 0;
}
* 号的含义
1.表示乘法
2.表示定义一个指针变量,使得普通的变量与指针变量区分开
3.表示获得指针的数据,是一种间接操作(解引用)
总结:指针是内存的地址,指针变量时保存了内存地址的变量。指针的大小在32位平台是4个字节,在64位平台是8个字节。
2.悬空指针
悬空指针也称为野指针,是没有访问权限的地址。这个地址可能存在也可能不存在,总之你无法访问。
3.空指针
空指针表示当前是一个无效指针(NULL),一定程度上可以当做不存在
2.指针应用
1.指针的值传递
应用于函数当中,不用在函数调用后返回具体的值即可实现函数目标。
void swap(int a, int b) {
int c = a;
a = b;
b = c;
}
int main() {
int x = 10, y = 20;
swap(x, y);
return 0;
}
2.指针的地址传递
void swap(int *pa, int *pb) {
int c = *pa;
*pa = *pb;
*pb = c;
}
int main() {
int x = 10, y = 20;
swap(&x, &y);
return 0;
}
在这种情况下,实际的数值并没有被传递,传递的是存放数值的指针,也就是数值存放的具体地址,在函数调用中,由这个传递的地址来读取数据具体的值。这种应用于较大较多的数据调用中较为合适。因为指针的大小只有4个字节,但传递的数据可以是大量的(如数组数据的第一个数据地址,后序的数据提取只需依次读取即可,并不需要实际传输一整个数组的数据)
3. *与&的意义
*在前面已经介绍过具体的意义了,&在这里表示对所表示指针地址的解读,即取地址
比较复杂的有: *&a &*pa
*&a表示为 *(&a) &a表示去变量a的地址,等价于pa,*(&a)则表示去这个地址上的数据,即为a本身
&*pa 表示为 &(*pa),*pa表示取得pa指向的数据(即为a),&(*pa)表示数据的地址,即为&a,即为pa
3.指针数组与数组指针(简单解释)
1.指针数组
指针数组是指一组指针,即连续的指针组成为一组数组,叫做指针数组,本质上是一组数组,数组内储存的元素为指针(即为存放的地址)
eg.
int a = 0 , b = 0 , c = 0 ;
int * arr[3] = { &a , &b , &c};
arr[3]中存放的是a,b,c的地址,并非a,b,c本身的值。
2.数组指针
即是一个指针,指向一个数组
eg.
int(*p)[3];
即表示指向由三个整型组成的数组的整体
在这里要注意,[]的优先级为1级,*(指针运算)的优先级为2 即 [ ] > *
这里仅是两者的简单介绍