C++灵魂指针详解

1. 内存四区

a).代码区。代码
b).全局区。
c).栈区。系统自动开辟,自动释放。并不是很大。
d)堆区。动态开辟的内存。手动开辟,手动释放。大
什么链表,各种数据结构,动态数组都在这一个区域

2. 地址

定义:把内存以单个字节为单位,分开。对每一个字节编号,这个编号就是地址。
a) 编号是连续的。
b) 唯一的。
c) 取地址运算符:&单目运算符 优先级()[]。 结合性右往左。
int a; //a 一个内存
&a;

3. 首地址

一段内存空间中第一个存储单元(指最大的单元)的地址。存储单元。

4. 指针变量

4.1 指针变量的定义:

数据类型 *变量名;
int *p; //定义一个指针变量p。存的是地址!!
//int 指明指针指向的数据类型
//*指明p这个变量是一个指针变量

4.2 指针变量的特点

1.用来存放地址的变量。2.内存大小4B
地址是一些编号,一种数据。
整数 int a;
字符 char c;
小数 float b;
地址 指针变量。

4.3 指针变量的赋值

P = &a; //p指向a

4.4 指针变量的引用

访问a这个int变量:

  1. 使用变量名:
  2. 指针访问:指针变量。取值运算符。返回某一个地址中的值。单目运算符 右到左。
    注意了:*在定义指针变量的时候int *p; *只是表明p是一个指针变量。非定义,p; 取值p指向的内存值。

4.5 指针变量的运算

    • ++ – 指针偏移,去访问地址旁边的一些内存。
      指针变量的加减,以指针所指向的类型空间单位进行偏移。
char *p;   //p char    1 p+1  1B
int  *p1;  //  int     4 p1+1 4B
double *p2;//  double  8 p2+1 8B

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

4.6 关于指针变量的两个概念

野指针:不能明确指向的指针变量。危险。
int p; //p里面保存的地址不确定, p指向是不明确的。重要数据。
int p = NULL;
空指针:int
float
char* double*
void* 转换成其他的数据类型。
动态内存分配。malloc(函数) new(字符)

5. 一维数组与指针

  1. 定义一个一维数组,数组名是这个数组的《首地址》。
int a[5];
//a 指向 a[0], a[0]int 的元素, a的类型就是  int*
//&a这个地址指向整个数组 &a 的类型     int(*)[5];

  1. 访问数组的元素
    下标法:
for (int i = 0; i < 5; i++)
{
	printf("%d", a[i]);
}

指针法:
(一)

int main()
{
	int  a[5] = { 1, 2, 3, 4, 5 };
	int *p = a; //p指向a[0]

	//*p;         //a[0]
	//*(p + 1);   //a[1]
    //*(p + 2);   //a[2]

	for (int i = 0; i < 5; i++) 
	{
		printf("%d", *(p + i));
	}
	return 0;
}

(二)

int  a[5] = { 1, 2, 3, 4, 5 };
int *p = a; //p指向a[0]
for (int i = 0; i < 5; i++) 
{
	printf("%d", *p++ );   //与前面的区别是p的值发生改变
}

(三)

int  a[5] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++) 
{
	printf("%d", *(a+i));   //a是数组名,把a看成指针常量。
                              //a不可随意改动,不可用a++方式访问
 }

总结:数组名不能够随意改变。不能改变。会报错。

6. 二维数组与指针

int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

数组名:a
a是二维数组的首地址:首地址???
a指向二维数组的第一个存储单元:
在这里插入图片描述
a是指向a[0]这个一维数组。a的类型是什么?

 int(*)[4];           a + 1          16B

a[0]是什么? 是一维数组的数组名。

a[0]指向a[0][0]这个元素; a[0]的类型是什么?

int*                 a[0]+1          4B
&a; int(*) [3][4];    &a+1  48

6.1 访问m行n列的元素(三种)

(一)
         a[m][n];
(二)
        *(a[m]+n);
(三)
        *(*(a+m)+n)
          
       //a指向a[0]
      //a+1指向a[1];
      //*(a+1)

7. 几个操作对应的类型

int a[3][4];
a           int(*)[4];
&a          int(*)[3][4];
a[0]        int*
a[0][0]     int

8. 拓展到多维思想

从高到低去拆(例子8维数组)

&a               //指向8维
a
a[0]
a[0][0]
a[][][]          int(*)[][][]
a[][][][]        int(*)[][]
a[][][][][]      int(*)[] 
a[][][][][][]    int*
a[][][][][][][]  int


指针数组:int*[]
数组指针:int(*)[]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值