【C++】C++基础知识(七)---指针
创始人
2024-01-29 05:28:52
0

C++基础知识(七)

  • 1. 指针的定义与使用
  • 2. 指针的内存
  • 3. 空指针和野指针
  • 4. const修饰指针
  • 5. 指针与数组
  • 6. 指针与函数
  • 7. 指针用于数组和函数的案例

1. 指针的定义与使用

指针的作用:
------通过指针可以直接的访问变量的内存,内存编号一般是从0开始记录的,一般用16进制数来表示,可以利用指针变量保存地址。

指针的定义语法:
------数据类型 * 指针变量名
指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。

指针的使用:
------可以通过解引用的方式找到指针指向内存中的数据,指针前加 * 表示:找到指针指向的内存中数据。

注意:
1、我们知道每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了变量在内存中的一个地址;指针变量指向的就是变量的内存地址。
2、通过在指针变量前加 * 一元操作符来返回位于操作数所指定地址的变量的值。*指针变量可以访问指针变量指向的内存地址中所对应的值。

  • 代码演示
#include 
using namespace std;int main() {// 1、指针的定义int a = 1314;int * p = &a;cout << "变量a的地址为:" << &a << endl;cout << "指针p为:" << p << endl;// 2、指针的使用*p = 2022;cout << "a = " << a << endl;cout << "*p = " << *p << endl;system("pause");return 0;
}
  • 输出结果
    在这里插入图片描述

2. 指针的内存

指针也是一种数据类型,它在32位操作系统中占用4个字节,在64位操作系统中占用8个字节

  • 代码演示
#include 
using namespace std;int main() {cout << "sizeof(int *) = " << sizeof(int *) << endl; //整型指针cout << "sizeof(float *) = " << sizeof(float *) << endl; //单精度浮点型指针cout << "sizeof(double *) = " << sizeof(double *) << endl; //双精度浮点型指针cout << "sizeof(char *) = " << sizeof(char *) << endl; //字符型指针system("pause");return 0;
}
  • 输出结果
    32位操作系统中(visual studio2022中解决方案平台为x86):
    在这里插入图片描述
    64位操作系统中(visual studio2022中解决方案平台为x64):
    在这里插入图片描述

3. 空指针和野指针

空指针
------指针变量指向内存编号为0的空间,内存编号0-255为系统内存,不允许用户访问
用途:
------用于初始化指针变量
注意:
------空指针指向的内存变量是不可以访问的,否则会报错

野指针
------指针变量指向非法访问的内存空间
注意:
------空指针与野指针都不是我们申请访问的内存空间,因此不要访问空指针和野指针指向内存中的数据。

  • 代码演示
#include 
using namespace std;int main() {//空指针int* p = NULL;//访问空指针会报错cout << *p << endl;//野指针int* p1 = (int*)0x1100;//访问野指针会报错cout << *p1 << endl;system("pause");return 0;
}
  • 输出结果
    访问空指针时:
    在这里插入图片描述
    访问野指针时:
    在这里插入图片描述

4. const修饰指针

const修饰指针有三种情况:
------1、const修饰指针(常量指针)
-----------指针的指向可以改,但是指针指向的值不能修改
------2、const修饰常量(指针常量)
-----------指针的指向不能修改,但是指针指向的值可以修改
------3、const即修饰指针又修饰常量
-----------指针的指向和指针指向的值均不能修改

注意:
------如何看const修饰的是指针还是常量,只需要看const后面紧跟着的是指针还是常量,如果是指针,则为常量指针;如果是常量,则为指针常量。

  • 代码演示
#include 
using namespace std;int main() {int a = 2022;int b = 1108;// 1、const修饰指针 ---常量指针// 指针的指向可以改,但是指针的指向的值不能改const int* p1 = &a;p1 = &b;//*p1 = 2050; //报错,指针指向的值不能修改// 2、const修饰常量 ---指针常量// 指针的指向不能修改,但是指针指向的值可以修改int* const p2 = &a;//p2 = &b; //报错,指针的指向不能改*p2 = 2050;// 3、const即修饰指针又修饰常量// 指针的指向和值均不能修改const int* const p3 = &a;//p3 = &b; //报错//*p3 = 2050; //报错system("pause");return 0;
}
  • 输出结果
    const修饰指针(常量指针)修改指针指向的值时报错:
    在这里插入图片描述
    const修饰常量(指针常量)修改指针的指向时报错:
    在这里插入图片描述
    const即修饰指针又修饰常量时修改指针的指向或者修改指向的值时均报错:
    在这里插入图片描述

5. 指针与数组

指针与数组是有一定联系的,我们可以利用指针访问数组中的元素。

  • 代码演示
#include 
using namespace std;int main() {int arr[10] = {1,9,9,5,4,8,6,0,9,3};int* p = arr; //数组名就是这个数组的首地址for (int i = 0; i < 10; i++){cout << *p << " "; //*p解引用对应指针指向的值p++; //p代表指针指向的地址}cout << endl;system("pause");return 0;
}
  • 输出结果
    在这里插入图片描述

6. 指针与函数

指针可以用作函数的形参,用来修改实参的值
1、值传递
-----不能用来修饰实参
2、地址传递
-----可以用来修饰实参
原因如下图所示:
在这里插入图片描述

  • 代码演示
#include 
using namespace std;void swap1(int num1,int num2)
{int temp = num1;num1 = num2;num2 = temp;cout << "num1 = " << num1 << endl;cout << "num2 = " << num2 << endl;
}void swap2(int *p1,int *p2)
{int temp = *p1;*p1 = *p2;*p2 = temp;cout << "*p1 = " << *p1 << endl;cout << "*p2 = " << *p2 << endl;
}int main() {// 1、值传递int a = 2022;int b = 1108;int c = 2022;int d = 1108;swap1(a, b);cout << "swap1 a = " << a << endl;cout << "swap1 b = " << b << endl;// 2、地址传递swap2(&c, &d);cout << "swap2 c = " << c << endl;cout << "swap2 d = " << d << endl;system("pause");return 0;
}
  • 输出结果
    在这里插入图片描述

7. 指针用于数组和函数的案例

  • 案例描述

封装一个函数,利用冒泡排序,实现对整个数组的升序排列

  • 思路分析

1、利用指针来访问数组中的元素;
2、利用指针作函数的形参;
3、封装一个bubblesort()函数,实现数组中元素的升序排列;

  • 代码实现
#include 
using namespace std;// 函数功能:实现数组中元素的升序排列
// 函数参数:(参数1:数组元素首地址;参数2:数组的长度。)
// 传入数组长度这个参数是为了便于代码的管理和修改
void bubblesort(int* arr, int length)
{for (int i = 0; i < length - 1; i++ ){for (int j = 0; j < length - i - 1; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() {// 1、定义一个整型数组int arr[10] = {6,8,0,2,3,5,1,7,9,4};int len = sizeof(arr) / sizeof(arr[0]);// 2、封装一个升序排列函数bubblesort(arr,len);// 3、对升序排列后的结果进行打印for (int i = 0; i < 10; i++){cout << arr[i] << " ";}cout << endl;system("pause");return 0;
}
  • 输出结果
    在这里插入图片描述

相关内容

热门资讯

台资深创业顾问吴建宏:“登陆”... 七八月正逢毕业季,毕业生自主创业的话题引发关注,门槛低、风险少的加盟项目赚足人气。台“行政院青辅会”...
国外新兴的行业 国外新兴的行业... 【宏观•王涵】为什么新兴市场又出事——新兴市场脆弱性的边际变化和形势展望 阿根廷发生债务违约,引发市...
boss直聘大学生求职 就业的... 新冠肺炎疫情下,2020年的春季招聘,对高校应届毕业生而言注定并不轻松。2020年春招季相当数量的企...
青海省新兴优势产业发展势头良好... 光伏新能源产业项目“领跑”全国,光电产业、3D打印、镁合金等产业项目从无到有,一批新材料技术填补国内...
a股芯片公司有多弱 全行业净利... 胡华雄最近美国对中兴通讯制裁的消息彰显了中国“缺芯”之痛。这种芯片产业的差距不仅体现在技术上,还直接...
我国高端芯片实现量产 中芯国际...   国产芯片兆芯ZX-C实现量产在第18届中国国际工业博览会上,兆芯开先ZX-C处理器夺得金奖。相关...
2017年以来邕宁新兴产业园区... 2017年以来,南宁市邕宁新兴产业园区管委会审时度势,运筹帷幄,坚定信心、鼓舞斗志,在邕宁经济发展的...
关于申报2017年第二批柳州市... 各县区工业管理部门,有关单位:为促进我市战略性新兴产业发展,根据《柳州市人民政府关于加快培育发展战略...
中国新兴的行业 中国新兴的行业... 确定不再关注此人吗确定取消文/新浪财经意见领袖专栏作家程实、钱智俊“世界赠我以创伤,而伤口将长出翅膀...
蒂诗丽在中国新兴产业国家战略北... 9月21日,第三届中国新兴产业国家战略北京论坛暨2018“最具竞争力品牌”电视盛典在北京隆重召开,来...