文章目录
紧接: (个人笔记)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;
}
注意:
它们的不同点有很多,只是他们之间的联系千丝万缕,以后使用多多注意。