7.指针
7.1 指针的基本概念
作用:可以通过指针间接访问内存
指针是用来记录内存地址编号的(指针就是一个地址)
1.定义指针
语法:数据类型 * 指针变量名
int a = 10; int * p; p = &a; 或者int *p = &a; cout<<"a的地址:"<<&a<<endl; cout<<"指针p的值:"<<p<<endl; //连着输出的值是一样的;
2.使用指针
可以通过解引用的方式来找到指针指向的内存;
指针前加 * 代表解引用,找到指针指向的内存数据;
*p=1000//代表找到了内存中存储的数据 cout<<"a = "<<a<<endl; cout<<"*p = "<<*p<<endl; //两者输出都是1000;
意思是通过指针p找到a的内存并且通过*p来修改a内存上的数据;
*p可以对其修改也可以对其进行读取;
7.3指针所占内存空间
指针也是一种数据类型
int * p占四个字节空间(32位操作系统下)占8个字节(64位操作系统下)
cout<<"sizeof(int *) ="<<sizeof(int *)<<endl; cout<<"sizeof(int *) ="<<sizeof(float *)<<endl; cout<<"sizeof(int *) ="<<sizeof(double *)<<endl; cout<<"sizeof(int *) ="<<sizeof(char *)<<endl; //输出全是4代表指针占4个字节
7.4空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存不可以访问(0-255之间的内存编号是被系统占用的我们无权限访问)访问会出错;
int *p;//指向未婚知 int *p = NULL;//空指针;
空指针不允许进行*p的操作,无论是输出还是 给其赋值
如cout <<*p<<endl;
或者*p = 100;都是不可以的;
野指针:
int * p = (int *)0x1100;
指针变量指向非法内存空间;
空指针和野指针都不是我们申请的空间因此不要随意访问
7.5const修饰指针
1.const修饰指针----常量指针
2.const修饰常量----指针常量
3.const既修饰指针又修饰常量
1.const修饰指针----常量指针
int a = 10; int b = 20; int const int *p=&a;//常量指针 特点指针指向可以修改但是指针指向的值不可以修改 *p = 20;错误 p = &b;对
主要看const和*的位置;
const (常量)
*(指针)
const后面跟的是p则不能改p;后面跟的是*p则不能改 * p;
2.const修饰常量----指针常量
int * const p = &a; //特点:指针的指向不可以改但是指向的值可以改; *p = 20;//对; p = &b//错误;
指针常量和常量指针要看const后面跟的是什么;
如果const 后面是变量p则const p就变成一个常量前面是一个int *说明常量在指针后面因此就是指针常量;
3.const既修饰指针又修饰常量
const int * const p = &a;//指向和指向的值都不可以改;
7.6指针和数组
利用指针访问数组中的元素
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = arr;//arr就是数组的首地址 cout<< "利用指针来访问第一个元素"<<*p<<endl;//输出1 p++;//让p向后偏移4个字节; cout<<"利用指针访问第二个元素"<<*P<<endl;//输出2
7.7指针和函数
利用指针作为函数参数可以修改实参的值
1.值传递
2.地址传递
void swap(int *p,int *p2)//用指针来接受a,b的地址//创建p保存了变量a的地址同理p2 { int temp = *p;//临时分配内存保存*p即a的值 *p = *p2;//a地址上的值被改变了而a的地址没有改变 *p2 = temp; } int a = 10;//分配四字节空间存入10; int b = 20;//分配四字节空间存入20; swap(&a,&b);//地址传递跳转
7.8指针,数组,函数
案例:封装一个函数,利用冒泡排序实现对整型数组的升序排序
#include<iostream> using namespace std; //冒泡排序函数 void bubbleSort(int*arr,int len ){ for(int i = 0;i<len-1;i++){ for(int j =0;j<len-i-1;j++){ if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = a[j+1]; a[j+1] = temp; } } } } void printfA int main(){ //创建数组; int arr[10] = {3,4,2,1,6,7,8,9,10,11}; //数组长度 int len = sizeof(arr)/sizeof(arr[0]); //创建函数,实现冒泡排序 bubbleSort(arr,len) system("pause"); return 0; }