什么是指针
一、指针与数组
1.指针指向数组表达方式:
int a[] = {3,5};
<1> int *p = &a[0];
<2>int *p = a;
但是不能是int *p = &a;否则会报错 "int (*)[2]" 类型的值不能用于初始化 "int *" 类型的实体。
注意:为什么不能“&数组名”
其实可以这样理解int a[2]就这个而言
a数组里面的元素是int类型的,也就是说a[0]与a[1]是int类型的
而a是int*类型的,因此a是一个指针,它指向a[0]这个地址,但它是一个大小固定并且指向的位置不能改变的。
2.指针数组、数组指针
2.1 数组指针
int a = [4,7];
int (*p)[2] = &a; p是一个指针,指向一个数组,数组内是两个整型数据
若p+1,
#include<iostream>
using namespace std;
int main() {
int a[] = {3,1,5,9 };
int(*p)[4] = &a;
cout << p + 1 << endl;
return 0;
}
//0000006159CFFAC8
p+1 随机指向一片内存
数组指针与int *q = &a[0]有什么区别呢?普通指针q+1时,由a[0]到了a[1] ,而数组指针p+1时,指针直接跳出了整个数组。
可根据以下代码清晰概念
#include<iostream>
using namespace std;
int main() {
int a[] = { 3,1,5,9 };
int(*p)[4] = &a;//p是一个指针
int* q = a;
for(int i = 0;i<4;i++)
cout << a[i] << endl;
cout <<"数组指针:\n"<< " p = " << p << endl;
cout << " *(p+1) = " << *(p + 1) << endl << endl;
cout <<"普通指针:\n" << " q = " << q << endl;
cout << " *(q+1)= " << *(q + 1) << endl << endl;;
cout << " &a[0] = " << &a[0] << endl;
cout << " a[0] = " << a[0] << endl;
return 0;
}
2.2指针数组 int* a[4]
p是一个数组,数组内有三个元素,每个元素都是指针,指向整型数据(使用时不要忘记初始化)。
#include<iostream>
using namespace std;
int main() {
int b[] = {3,1,5,9 };
int* a[4];
for(int i=0;i<4;i++)
a[i] = &b[i];//初始化
for (int i = 0; i < 4; i++)
cout << *a[i] << ", a["<<i<<"] = "<<a[i]<<endl;
return 0;
}
3.for循环与(指针+1)
#include<iostream>
using namespace std;
int main() {
int a[] = {3,1,5,9 };
int* p;
p = &a[0];
for (int i = 0; i < 4; i++)
cout << *p++ << " ";//或*(p+i)
return 0;
}
//3 1 5 9
//这里也能说明指针+1,加的是数据类型占的储存单元个数
二、const与指针
1.常量指针:const 修饰指针
const int *p = &a;(方便记忆:先是const,再是指针,所以叫常量指针)
指针指向可以改变,但指针指向值不可以改。
正确使用:
#include<iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
const int* p = &a;//const之后是指针,所以叫常量指针
p = &b;
cout << *p << endl;
return 0;
}
//20
错误使用❌
2.指针常量 :
int * const p = &a;(快速记忆:先是int *声明一个指针,再const,所以叫指针常量)
正确使用:
#include<iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
int* const p = &a;
*p = 30;
cout << *p << endl;
return 0;
}
//30
错误使用