(个人笔记)C/C++基础知识(二)


紧接: (个人笔记)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;
}

在这里插入图片描述
注意:
它们的不同点有很多,只是他们之间的联系千丝万缕,以后使用多多注意。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值