数组、指针及内存

一、内存四区

    a)  代码区。存放代码
    b) 全局区。全局的常量、字符串常量和变量
    c)  栈区。 系统自动开辟,系统自动释放,并不是很大。比如for循环中的int i = 0。
    d) 堆区。动态开辟的内存,手动开辟,手动释放。大。比如自己定义的数据结构

二、地址:把内存以单个字节为单位,分开。对每个字节进行编号,这个编号就是地址

   a) 编号连续
   b)唯一的
   c)取地址运算符 :&。单目运算符, 优先级很高, 结合性从右往左

三、首地址:一段内存空间第一个存储单元的地址。存储单元
四、指针变量
1.用来存放地址的变量。 2.内存大小4B

   int a = 5;
  • 指针变量的定义
    数据类型 *变量名
    int *p;//定义指针变量。存放地址;
    int指明指针指向的数据类型;
    *指明p这个变量是指针变量
  • 指针变量的赋
    p = &a; //p指向a
  • 指针变量的引用
    访问a这个变量
    1、使用变量名 a;
    2、指针访问:*指针变量 *p*取值运算符。返回某个地址中的值。单目运算符,从右到左
    在定义指针时候,*只表明p是一个指针变量;非定义时候,*p取值p指向的内存值。

野指针: 不能明确指向的指针变量。

    int *p //P保存的地址不确定,指向不明确.可能会操作到重要数据(并不想看见的)

最好定义为:

    int *p = NULL;
    *p = 100; 这步也是错误的,因为NULL就是0地址,计算机0-255是计算机内部私有内存地址

万能指针: void *

	int a =10;
	void* p = &a //当不知道a的类型时,用void替代
	*(int*)p = 100; //但是在重新赋值时候必须加上类型强制转换,要不然不知道应该读取多大内存空间存100

四、指针变量的运算

   +, -, ++, -- 指针偏移,访问地址旁边的内存

p + 1指针变量的加减,以指针所指向的类型空间为单位进行偏移。

首地址: 一段内存空间第一个存储单元的地址。存储单元
指针变量的加减,以指针所指向的类型空间为单位进行偏移


五、一维数组与指针

初始化

	int a[2] = {1, 2};
	int a[5] = {1, 2, 3}; //后面没有初始化的元素默认为0
	int a[] = {1, 2} ;//两个元素
	int a[] = {} ;//错误

在C++11中新加了列表初始化:

	1、省略=: int a[] {1, 2};
	2、大括号为空,所有元素置零。 int a[1] {};

c中数组元素参数不能为变量,c++可以:

	const int n = 3;
	int a[n] ;
  1. 定义一个一维数组,数组名是这个数组的首地址,是一个常量
    定义int a[5],a指向a[0], a[0]是int元素,a的类型就是 int*,
    但是&a这个地址指向的是整个数组, 它的类型是int(*)[5]
  2. 访问数组元素
    下标法或者int *p = a;a是数组名,首地址。永远是数组名,不能通过自加减去访问数组元素。

六、二维数组与指针
定义 int a[3][4];
数组名 a是二维数组的首地址;
a指向二维数组的第一个存储单元(一维数组);&a指向整个数组,其类型是int(*)[3][4]
a是指向a[0]这个一维数组;a的类型是int(*)[4];
a[0]指向a[0][0]; a[0]的类型是int *;相当于数组名

访问 m行n列:

a[m][n];
*(a[m] + n);
*( *(a + m) + n);
#include <iostream>
using namespace std;

int main()
{
	int a[2][3] = { 1, 2, 3, 4, 5, 6};
	
	//cout<<*(a+1)<<endl; == cout<<a+1<<endl;
	cout<<a[1][1]<<endl;
	cout<<*(a[1]+1)<<endl;
	cout<<*(*(a+1)+1)<<endl;
	
	return 0;
} 

七、指针与const

  1. 通过一级指针改变const修饰的常量
	const int a = 10;
	int* p = &a;
	*p = 100;
  1. 如果是const修饰的int*(指针类型),则不能改变指针变量指向的内存空间的值,但是可以改变指针指向的地址
	 int a = 10;
	 const int* p ;
	 p = &a;
	 //*p = 100;这句话报错
	 int b =100;
	 p = &b; //没问题
  1. const修饰指针变量,可以改变指针变量指向地址的值,但不能改变指针指向的地址
int a= 10;
int b =100;
int* const p = &a;
*p = 100; //正确
p = &b; //错误
  1. const 修饰指针类型,也修饰指针变量,那么不能改变指针指向的地址,也不能改变指针指向的值
int a = 10;
const int* const p = &a;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值