定义
int* p;
int a = 10;此时内存中有一个块会属于a,并且对应的值为10
p = &a;上面的块会有个地址,&符号是“取地址”,将a的地址赋给p,此时指针p储存的是a的地址(例如0x0011)
*p ;*符号是“解引用”,返回p地址指向的,即为a,也就是10。
连起来写就是:
int *p = &a;
cout << *p << endl;
cout << a << endl;
结果都是10
cout << p << endl;
结果为a的地址
通过指针可修改元素值:*p = 1000;,这时*p和a输出都变为了1000.
利用指针访问数组元素
int *p = arr;
数组名就代表数组的首地址,此时如果输出*p,返回的是数组第一个元素;
通过语句
p++;
即可遍历数组,代码如下;
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int* p = arr;
for (int i = 0; i < 10; i++) {
cout << *p < endl;
p++;
}
指针和函数
值传递:形参改变,实参不变
地址传递:形参实参都改变
void swap(int* p1, int* p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main(){
int a = 10;
int b = 20;
swap(&a, &b);
}
注意:*和&符号不能少,相当于是将a的地址传到了函数体里面了
上述代码运行过程:
先在内存中创建一个块,名字为a,值为10;
接着创建b,值为20;
执行swap(&a, &b);传入函数:void swap(int* p1, int* p2),
相当于int *p1 = &a;int *p2 = &b;
先创建p1,储存a的地址,再创建p2,储存b的地址
接着执行语句int temp = *p1; 创建temp,值为*p1,也就是p1对应的a的值,为10;
*p1 = *p2;将p1指向的a值改为p2指向的值---20;
*p2 = temp;将p2指向的b的值改为temp的值---10;
此时程序运行结束,实参a、b都改变了