指针基本知识点
指针基本概念
定义指针
指针的作用:
可以通过指针间接访问内存(指针记录地址编号,或,指针就是地址)。
int a;
int*p; //数据类型 * 指针变量名
a=&p; //让指针记录变量 a 的地址
&p 是将元素 p 转化成一个地址。而 *p 则是接收地址,并对其进行访问。
使用指针
- 可以通过解引用的方式找到指针指向的内存。
- 指针前加上 * ,表示解引用。
- 可以用指针间接访问数值,并对其进行修改。
指针所占内存
系统操作系统 | 字节空间 |
---|---|
32位(x86) | 4个字节 |
64位(x64) | 8个字节 |
空指针和野指针
空指针
定义: 初始化指针变量(空指针指向的内存不可以访问)
int*p;
*p=NULL;
/*
此时系统给其分配的空间位于[0,255],
但[0,255]为系统占用内存,不允许用户访问。
*/
野指针
定义: 指针变量指向非法的内存空间(可以理解为越界行为)。
int *p;
*p=(int*)0x1100;
//在程序中,出现野指针就会报错。
const 修饰指针
const 修饰指针 ------常量指针
指针的指向可以修改,但指针指向的值不可以改。
int a=10;
int b=10;
const int*p=&a;
*p=20;
//错误
*p=&b;
//正确
const 修饰常量 ------指针常量
指针的指向不可以改,但指针指向的值可以改。
int a=10;
int b=10;
const int*p=&a;
*p=20;
//正确
*p=&b;
//错误
const 既修饰指针,又修饰常量
指针的指向和值都不可以改。
const int * p=&a;
指针和数组
int arr[5]={0,1,2,3,4};
int * p=arr;
//arr就是数组首地址
cout<<"利用指针访问第一个元素:”<<*p<<endl;
//其输出的结果为 0 。
p++;
//让指针向后偏移四个字节(x86)
cout<<"利用指针访问第二个元素:"<<*p<<endl;
指针和函数
值传递
地址传递
#include<iostream>
using namespace std;
void swap(int*a ,int*b);
int main()
{
int a=10;
int b=20;
swap(&a,&b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
void swap(int*a ,int*b)
{
int temp=*a;
*a=*b;
*b=temp;
cout<<"swap a="<<a<<endl;
cout<<"swap b="<<b<<endl;
}
//实参 a ,b 和形参 a ,b 都发生了改变
双指针( ** )
双指针可以理解为,指针的指针。在处理二维数组中可以用到。
int ** p;
而对于为二维数组开辟空间则需要使用到 new 。此处在【C++006】中详细讲解。