一、内存四区
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] ;
- 定义一个一维数组,数组名是这个数组的首地址,是一个常量
定义int a[5]
,a指向a[0], a[0]是int元素,a的类型就是 int*,
但是&a
这个地址指向的是整个数组, 它的类型是int(*)[5]
- 访问数组元素
下标法或者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
- 通过一级指针改变const修饰的常量
const int a = 10;
int* p = &a;
*p = 100;
- 如果是const修饰的int*(指针类型),则不能改变指针变量指向的内存空间的值,但是可以改变指针指向的地址
int a = 10;
const int* p ;
p = &a;
//*p = 100;这句话报错
int b =100;
p = &b; //没问题
- const修饰指针变量,可以改变指针变量指向地址的值,但不能改变指针指向的地址
int a= 10;
int b =100;
int* const p = &a;
*p = 100; //正确
p = &b; //错误
- const 修饰指针类型,也修饰指针变量,那么不能改变指针指向的地址,也不能改变指针指向的值
int a = 10;
const int* const p = &a;