c和c++都有指针的概念,指针其实就是记录数据地址的变量
一、指针的定义和使用:指针定义的语法:数据类型 *指针变量名;
假设 int a = 10;
int * p;
让指针记录变量a的地址:p = &a;
使用指针的时候需要解引用,在p前加 * 即可, * p就可使用指针;
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int *p = &a;
//查看指针p
cout << p << endl;
cout << &a << endl;
cout << *p << endl;
cout << a << endl;
//使用指针
*p = 500;
cout << p << endl;
cout << &a << endl;
cout << *p << endl;
cout << a << endl;
return 0;
}
输出结果为:
006FFAF4
006FFAF4
10
10
006FFAF4
006FFAF4
500
500
二、指针所占空间大小:在32为操作系统中,占4个字节空间大小;在64为操作系统中,占8个字节空间大小。
#include <iostream>
using namespace std;
int main()
{
cout << sizeof(int *) << endl;
cout << sizeof(double *) << endl;
cout << sizeof(float *) << endl;
cout << sizeof(char *) << endl;
return 0;
}
运行结果:
4
4
4
4
三、空指针:指针变量指向内存空间为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
#include <iostream>
using namespace std;
int main()
{
int *p = NULL;
//空指针不可访问
// *p = 100; 会报错
return 0;
}
四、野指针:指针变量指向非法的内存空间
#include <iostream>
using namespace std;
int main()
{
int *p = NULL;
//指针变量指向内存空间为0xll的空间
p = (int *)0x1100;
//访问出错
cout << *p << endl;
return 0;
}
五、const 修饰指针
3种情况:const修饰指针,——常量指针;
const修饰常量,——指针常量;
const及修饰指针,又修饰常量;
(1)const修饰指针:指针的指向可以修改,但是指针指向的值不可以改;
const int *p = 10;
*P = 20;//错误
p = a;//正确
(2)const修饰常量:指针的指向不可以修改,但是指针指向的值可以改;
int * const p = 10;
*P = 20;//正确
p = a;//错误
(3) const及修饰指针,又修饰常量:指针的指向和指针指向的值都不能更改
const int * const p = 10;
六、指针和数组的使用
利用指针输出数组
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 1,3,5,3,6,3,6 };
int *p = arr; //arr就是数组的首地址
for (int i = 0; i < size(arr); i++)
{
cout << *p << endl;
p++;
}
return 0;
}
输出结果:
1
3
5
3
6
3
6
七、指针和函数
注意:值传递不会修改实参的值,地址传递会修改实参的值。
#include <iostream>
using namespace std;
void test1(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << a << " " << b << endl;
}
void test2(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
cout << *a << " " << *b << endl;
}
int main()
{
int a = 4;
int b = 5;
test1(a, b);
test2(&a, &b);
cout << a << " " << b << endl;
return 0;
}
输出结果:
5 4
5 4
5 4