文章目录

  • 一 数组
    • 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 = &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 = &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 = &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++基础知识(二)相关推荐

  1. oracle:oracle基础知识(二)

    oracle基础知识(二)笔记:高级查询 文章目录 分组查询 多属性分组语法: 过滤查询 group by 语句增强 sqlplus报表功能 多表查询 等值连接 外连接 自连接 子查询 子查询中的空值 ...

  2. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  3. CV:计算机视觉技术之图像基础知识(二)—图像内核的可视化解释

    CV:计算机视觉技术之图像基础知识(二)-图像内核的可视化解释 目录 图像内核的可视化解释 测试九种卷积核 官方Demo DIY图片测试 DIY实时视频测试 相关文章 CV:计算机视觉技术之图像基础知 ...

  4. CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)

    CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...

  5. (五)JS基础知识二(通过图理解原型和原型链)【三座大山之一,必考!!!】

    JS基础知识二(原型和原型链) 提问 class 继承 类型判断(instanceof) 原型 原型关系 基于原型的执行规则 原型链 说明 提问 如何准确判断一个变量是不是数组 class的原型本质 ...

  6. 前端学习笔记(js基础知识)

    前端学习笔记(js基础知识) JavaScript 输出 JavaScript 数据类型 常见的HTML事件 DOM 冒泡与捕获 流程控制语句 for..in 计时器 let,var,const的区别 ...

  7. LTE-V2X笔记:一些基础知识

    原文转载地址:LTE-V2X笔记:一些基础知识 (1)LTE-V2X技术 频段:5905~5925MHZ(试验频段) 调制方式:QPSK 正交相移键控 功率:23dBm (2)LTE-V2X通信模式 ...

  8. 网络基础知识(二) HTTP

    网络基础知识(二) HTTP 黑发不知勤学早,白首方悔读书迟. 内容参考:https://www.runoob.com/http/http-content-type.html HTTP协议是Hyper ...

  9. CV:计算机视觉技术之图像基础知识(二)—图像内核的九种卷积核可视化解释(blur/bottom sobel /emboss/identity /sobel /outline/sharpen)

    CV:计算机视觉技术之图像基础知识(二)-图像内核的九种卷积核可视化解释(blur/bottom sobel /emboss/identity /left sobel /outline/right s ...

  10. scikit-learn学习基础知识二

    scikit-learn学习基础知识二 文章目录 scikit-learn学习基础知识二 一.介绍 二.代码实现 三.运行结果 四.总结 一.介绍 本文我们学习scikit-learn中的KNeigh ...

最新文章

  1. PyTorch教程(七):属性统计
  2. 获取一组radio按钮选中的值Value
  3. 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-008排序算法的复杂度(比较次数的上下限)...
  4. Nutch 是一个开源Java 实现的搜索引擎
  5. 【软件开发底层知识修炼】二十八 C/C++中volatile的作用
  6. 【2017年第1期】基于文本大数据的企业信用风险评估
  7. 数据库乱象丛生,开发者该如何选择?
  8. Memcached(四)Memcached的CAS协议
  9. java 单行文本_Java Swing界面编程(17)---单行文本输入组件:JTextField
  10. Unity 脚本的生命周期
  11. java hibernate映射_java – Hibernate教程 – 在哪里放置映射文件?
  12. 项目管理:系统需求分析模板
  13. 110道 MySQL面试题及答案 (持续更新)
  14. java识别快递单的条形码_根据快递单的条码图片识别单号
  15. 峰值电流检测电路设计/自己备忘
  16. 中国热泵热水器行业发展趋势及投资风险研究报告
  17. 怎么将三张图片合成一张图片?
  18. (对抖音程序员隔空笔芯)抖音解析去水印iteminfo接口被封死,再放一个最新的去水印原理,无视频长度限制
  19. Synergy安装及使用方法
  20. java的八种基本数据类型

热门文章

  1. 洛谷P4766 [CERC2014]Outer space invaders题解
  2. 【云安全】云计算中常见的网络虚拟化
  3. 基于搜索指数预测各城市首轮感染高峰期;AI+眼镜:失聪者看字幕盲人听语音;ChatGPT VSCode插件教程;谷歌开源注意力中心模型 | ShowMeAI资讯日报
  4. ios 项目被拒绝各种理由
  5. 【工业4.0】深度报告:独家解密工业4.0真正图谋?
  6. PIC32MX 读写flash调试经验
  7. 京东2016面经(算法春招实习)
  8. 【SAP消息号AAPO520】
  9. 数据恢复软件28款简单测试绿色下载
  10. 令人抓狂的Linux桥接设定奇遇