(个人笔记)C/C++基础知识(二)
文章目录
- 一 数组
- 1.1 一维数组
- 1.1.1 第一种定义方式
- 1.1.2 第二种定义方式(推荐)
- 1.1.3 数组名称的用途
- 1.2 二维数组
- 1.2.1 定义方式
- 1.2.2 二维数组名的使用
- 二 指针
- 2.1 定义
- 2.2 使用
- 2.3 占储存空间
- 2.4 空指针
- 2.5 野指针
- 2.6 const修饰指针
- 2.6.1常量指针
- 2.6.2指针常量
- 2.6.3 两者都修饰
- 三 指针和数组
紧接: (个人笔记)C/C++基础知识(一)
一 数组
1.在数组中每个数据元素都是相同的数据类型
2.数组是由连续的内存空间组成的
1.1 一维数组
1.1.1 第一种定义方式
#include <iostream>
using namespace std;
int main()
{//第一种定义方式cout << "第一种定义方式" << endl;int arr1[5] = {1,2,3};//获取数组的数据个数int len1 = sizeof(arr1)/4; //打印输出for (int i = 0; i < len1; i++){cout << arr1[i] << " ";}cout << endl;system("pause");return 0;
}
1.1.2 第二种定义方式(推荐)
#include <iostream>
using namespace std;int main()
{//第二种定义方式cout << "第二种定义方式" << endl;int arr2[] = {1,2,3};//获取数组的数据个数int len2 = sizeof(arr2)/4; //打印输出for (int i = 0; i < len2; i++){cout << arr2[i] << " ";}cout << endl;system("pause");return 0;
}
1.1.3 数组名称的用途
1.统计整个数组所占的内存空间(单位字节)
#include <iostream>
using namespace std;int main()
{//利用方式二定义一个数组int arr3[] = {6,6,6,6,6,6};//获取数组所占的空间int len3 = sizeof(arr3); cout << len3 << endl;system("pause");return 0;
}
所占空间:4X6=24个字节;
2.获取数组的首地址
#include <iostream>
using namespace std;int main()
{//利用方式二定义一个数组int arr4[] ={0};//获取数组的首地址 cout << arr4 << endl;//这种方式也可以获得//cout << &arr4[0]<< endl; system("pause");return 0;
}
特别注意:数组名是个常量,不可进行复制操作,比如arr4++
1.2 二维数组
1.2.1 定义方式
注意 :
- arr1[2][3] 表示有一个2行3列的二维数组;
- 定义时列数必须写
#include <iostream>
using namespace std;int main()
{//第一种定义方式int arr1[2][3] = { {2,3,3},{1,1,1} };//第二种定义方式int arr2[2][3] = { 2,3,3,1,1,1 };//第三种定义方式int arr3[][3] = { 2,3,3,1,1,1 };//打印输出cout << "方式一:" << endl;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){ cout << arr1[i][j] << " "; }cout << endl; }cout << "方式二:" << endl;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr2[i][j] << " ";}cout << endl; }cout << "方式三:" << endl;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr3[i][j] << " ";}cout << endl;}system("pause");return 0;
}
我们可以看到不管哪种方式定义输出结果都是正确的 ;
1.2.2 二维数组名的使用
1.查看数组所占的空间(单位字节)
int arr[2][3]={{2,3,3},{1,1,1}};//查看整个数组所占的空间sizeof(arr); //24个字节//查看第一行所占的空间sizeof(arr[0]); //12个字节
2.查看二维数组的行数和列数
//查看行数 //数组所占的空间/数组第一行所占的空间=行数 sizeof(arr)/sizeof(arr[0]); //查看列数//数组第一行所占的空间/数组第一行第一个所占的空间=列数sizeof(arr[0])/sizeof(arr[0][0]);
3.查看首地址
a[0]为首地址或&a[0][0];
int a[3][3];int* p;p = a[0];//或p = &a[0][0];
二 指针
概念:
- 间接访问内存
- 通过指针保存一个地址,指针的实质还是一个变量。
2.1 定义
注释详细,多看多看
#include <iostream>
using namespace std;int main()
{//定义一个变量int num = 2020;//定义一个指针变量,保存num的地址//‘&’ 为取地址符int* ptr_num = #//取出指针指向的地址的值 //‘*’ 为解引用cout << *ptr_num << endl;system("pause");return 0;
}
多多注意:
指针的数据类型要和指向的变量数据类型一样
2.2 使用
注释详细,多看多看
#include <iostream>
using namespace std;
int main()
{//定义一个变量int num = 2020;//定义一个指针变量,保存num的地址//‘&’ 为取地址符int* ptr_num = #//取出指针指向的地址的值 //‘*’ 为解引用cout << "*ptr_num="<< *ptr_num << endl;//改变地址所存储的值*ptr_num = 2333;//打印num的值cout <<"num="<< num << endl;system("pause");return 0;
}
2.3 占储存空间
想不出就派出 sizeof()
#include <iostream>
using namespace std;
int main()
{//定义一个变量int num = 2020;//定义一个指针变量,保存num的地址//‘&’ 为取地址符int* ptr_num = #//输出地址所占的字节cout << sizeof(ptr_num) << endl;system("pause");return 0;
}
- 当设置编译器为64位时
- 8个位为一个字节
- 因此指针所占的空间为8个字节,8X8=64吖(好理解)
- 当设置编译器为32位时
- 8个位为一个字节
- 因此指针所占的空间为4个字节,4X8=32(老简单了)
多多注意:
无论定义指针的数据类型是什么,其所占的内存空间,都是如此;
2.4 空指针
概念:
- 指针变量指向内存中编号为0的空间
- 编号为0~255为系统占用内存,无法访问。
定义:
- 仅用于初始化,空指针无法访问
//两种方法都可以,看各位喜好//c++11新定义方法int *p1= nullptr;//惯用方法int *p2= NULL;
2.5 野指针
了解概念即可:
- 指向了非法的内存空间,访问时会报错。
//野指针,错误使用
int *p=(int *)0x0000;
2.6 const修饰指针
2.6.1常量指针
- 指针指向可以变
- 指针指向的值不可以变
#include <iostream>
using namespace std;
int main()
{//定义一个变量int num1 = 2020;int num2 = 2018;//定义常量指针const int* ptr_num = &num1;//指针指向可以变ptr_num = &num2;//指针指向的值不可以变//报错:表达式必须是可修改的左值//*ptr_num = 666;system("pause");return 0;
}
2.6.2指针常量
- 指针指向不可以变
- 指针指向的值可以变
#include <iostream>
using namespace std;
int main()
{//定义一个变量int num1 = 2020;int num2 = 2018;//定义指针常量int* const ptr_num = &num1;//指针指向不可以变//报错:表达式必须是可修改的左值//ptr_num = &num2;//指针指向的值可以变*ptr_num = 666;system("pause");return 0;
}
2.6.3 两者都修饰
- 常量指针常量(自创随便看看)
- 指针指向不可以变
- 指针指向的值也不可以变
#include <iostream>
using namespace std;
int main()
{//定义一个变量int num1 = 2020;int num2 = 2018;//定义常量指针常量const int* const ptr_num = &num1;//指针指向不可以变//报错:表达式必须是可修改的左值//ptr_num = &num2;//指针指向的值不可以变//报错:表达式必须是可修改的左值//*ptr_num = 666;system("pause");return 0;
}
三 指针和数组
这两哥们,孪生兄弟没话说
why?
- 数组的数组名可以表示地址;
- 指针也是如此;
- 用于遍历(两种方式一摸一样)
#include <iostream>
using namespace std;
int main()
{//定义一个数组int arr[] = {1,2,3,4,5};//指向首地址//没有用取地址符int* p = arr;cout << "第一种遍历方式" << endl;for (int i = 0; i < (sizeof(arr) / 4); i++){cout << *arr+i << " ";}cout << endl;cout << "第二种遍历方式" << endl;for (int i = 0; i < (sizeof(arr) / 4); i++){cout << *p + i << " ";}cout << endl;system("pause");return 0;
}
注意:
它们的不同点有很多,只是他们之间的联系千丝万缕,以后使用多多注意。
(个人笔记)C/C++基础知识(二)相关推荐
- oracle:oracle基础知识(二)
oracle基础知识(二)笔记:高级查询 文章目录 分组查询 多属性分组语法: 过滤查询 group by 语句增强 sqlplus报表功能 多表查询 等值连接 外连接 自连接 子查询 子查询中的空值 ...
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- CV:计算机视觉技术之图像基础知识(二)—图像内核的可视化解释
CV:计算机视觉技术之图像基础知识(二)-图像内核的可视化解释 目录 图像内核的可视化解释 测试九种卷积核 官方Demo DIY图片测试 DIY实时视频测试 相关文章 CV:计算机视觉技术之图像基础知 ...
- CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)
CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...
- (五)JS基础知识二(通过图理解原型和原型链)【三座大山之一,必考!!!】
JS基础知识二(原型和原型链) 提问 class 继承 类型判断(instanceof) 原型 原型关系 基于原型的执行规则 原型链 说明 提问 如何准确判断一个变量是不是数组 class的原型本质 ...
- 前端学习笔记(js基础知识)
前端学习笔记(js基础知识) JavaScript 输出 JavaScript 数据类型 常见的HTML事件 DOM 冒泡与捕获 流程控制语句 for..in 计时器 let,var,const的区别 ...
- LTE-V2X笔记:一些基础知识
原文转载地址:LTE-V2X笔记:一些基础知识 (1)LTE-V2X技术 频段:5905~5925MHZ(试验频段) 调制方式:QPSK 正交相移键控 功率:23dBm (2)LTE-V2X通信模式 ...
- 网络基础知识(二) HTTP
网络基础知识(二) HTTP 黑发不知勤学早,白首方悔读书迟. 内容参考:https://www.runoob.com/http/http-content-type.html HTTP协议是Hyper ...
- CV:计算机视觉技术之图像基础知识(二)—图像内核的九种卷积核可视化解释(blur/bottom sobel /emboss/identity /sobel /outline/sharpen)
CV:计算机视觉技术之图像基础知识(二)-图像内核的九种卷积核可视化解释(blur/bottom sobel /emboss/identity /left sobel /outline/right s ...
- scikit-learn学习基础知识二
scikit-learn学习基础知识二 文章目录 scikit-learn学习基础知识二 一.介绍 二.代码实现 三.运行结果 四.总结 一.介绍 本文我们学习scikit-learn中的KNeigh ...
最新文章
- PyTorch教程(七):属性统计
- 获取一组radio按钮选中的值Value
- 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-008排序算法的复杂度(比较次数的上下限)...
- Nutch 是一个开源Java 实现的搜索引擎
- 【软件开发底层知识修炼】二十八 C/C++中volatile的作用
- 【2017年第1期】基于文本大数据的企业信用风险评估
- 数据库乱象丛生,开发者该如何选择?
- Memcached(四)Memcached的CAS协议
- java 单行文本_Java Swing界面编程(17)---单行文本输入组件:JTextField
- Unity 脚本的生命周期
- java hibernate映射_java – Hibernate教程 – 在哪里放置映射文件?
- 项目管理:系统需求分析模板
- 110道 MySQL面试题及答案 (持续更新)
- java识别快递单的条形码_根据快递单的条码图片识别单号
- 峰值电流检测电路设计/自己备忘
- 中国热泵热水器行业发展趋势及投资风险研究报告
- 怎么将三张图片合成一张图片?
- (对抖音程序员隔空笔芯)抖音解析去水印iteminfo接口被封死,再放一个最新的去水印原理,无视频长度限制
- Synergy安装及使用方法
- java的八种基本数据类型
热门文章
- 洛谷P4766 [CERC2014]Outer space invaders题解
- 【云安全】云计算中常见的网络虚拟化
- 基于搜索指数预测各城市首轮感染高峰期;AI+眼镜:失聪者看字幕盲人听语音;ChatGPT VSCode插件教程;谷歌开源注意力中心模型 | ShowMeAI资讯日报
- ios 项目被拒绝各种理由
- 【工业4.0】深度报告:独家解密工业4.0真正图谋?
- PIC32MX 读写flash调试经验
- 京东2016面经(算法春招实习)
- 【SAP消息号AAPO520】
- 数据恢复软件28款简单测试绿色下载
- 令人抓狂的Linux桥接设定奇遇