一、什么是指针
计算机的内存是以字节Byte(在程序中定义一个变量时,C编译系统会根据所定义的变量类型,为其分配一定的字节空间,在32位的出处理器中,short in型数据占2字节,int型数据float型数据占4字节,double占8字节,char型数据占1字节,一个字节由8位二进制数组成)为单位的连续的储存空间,每个字节都有自己的编号。就像酒店的每个房间都有自己的编号,房间编号是连续的不断开的,内存的编号也是连续的,一般采用十六进制来表示,计算机中这些字节的房间编号被称为内存地址。
在C程序中,有两种方式存取储存单元的内容:
1.直接访问,通过变量名访问存取变量的内容
2.间接访问,通过访问存储变量的地址获取变量内容。其中存放变量地址的变量叫做指针。
二、什么时候用指针
#include<iostream>
//#include<string>
using namespace std;
void swap(int , int);
void swap(int x,int y) {
int t = 0;
t = x;
x = y;
y = t;
}
int main() {
int a = 15, b = 10;
swap(a, b);
cout << "a = " << a << ", " << "b=" << b << endl;
return 0;
}
//运行结果为“a = 15, b = 20”
由运行结果可见,参数的传递是从实参到形参的单方向传递,形参不会反过来把值传给实参,解决以上问题就需要指针。
三、怎么用指针
1. 数据类型 *指针变量名
int *p;
int *p1,*p2;
int *pa,pb;(指针变量pa与Int型变量);
定义时 | int *p = &a; | 表示变量P是指针 |
使用时 | *p = 100; | 表示取值,取指针指向内存空间的值 |
2.使用printf打印时用“%p”输出地址
#include<iostream>
using namespace std;
int main() {
int a = 100;
int* pa = &a;
printf("地址为:%p\n", pa);
return 0;
}
//地址为:000000709F0FFA64
3. 指针指向
(1) 指针+1
int型数据由4个内存单元组成,每个内存单元都有一个地址,但指针指向的永远是第一个存储单元,即任何类型的指针都指向存储该类型变量的首地址,所以指针+1,代表其存储的地址跳过(数据类型字节数)个存储单元。
所以: int *p;char *q;
p+1 == +4个字节
q+1 == +1个字节
(2)指针与前后缀++
间接访问运算符与自加运算符优先级相同,结合性都是自右向左
#include<iostream>
using namespace std;
int main() {
int a[] = {3,1,5,9 };
int b[] = { 3,1,5,9 };
int c[] = { 3,1,5,9 };
int d[] = { 3,1,5,9 };
int *p = &a[0];//或者*p = a;
int *q = b;
int* r = c;
int* t = d;
cout << "*p++ = " << *p++ << endl;
cout << "*p++ = " << *p++ << endl;
cout << "*p = " << *p << endl;
cout << "(*p)++ = " << (*p)++ << endl;
cout << "(*p)++ = " << (*p)++ << endl << "\n";
cout << "*++q = " << *++q << endl;
cout << "*++q = " << *++q << endl<<"\n";
cout << "++*r = " << ++*r << endl;
cout << "++*r = " << ++ * r << endl << endl;
cout << "t++ = " << t++ << endl;
cout << "t++ = " << t++ << endl;
cout << "*t = " << *t << endl<<endl;
return 0;
}