详细梳理c指针与数组

目录

前言

一,指针是什么

二,指针和指针类型

1,指针运算符

2,指针类型的意义

三,指针安全 

1,野指针成因  

2,如何规避野指针   

四.,指针运算 

1,赋值运算 

2,指针与整数的加减

3,指针  -  指针 

4,自增,自减运算

5,关系运算 

 五,指针与数组

1,指向整形数组的指针

2,数组名与指针的区别:

3,字符指针

4,指针数组 

5,二维数组

6,数组指针

7,&数组名和数组名

 六,二级指针

 七, 数组参数、指针参数

1,一维数组传参

2,二维数组传参

 八,函数指针


本文约万字内容,详细梳理了指针与数组,诚意满满,若对文章给予认可,可以点个赞谢谢

一,指针是什么

指针理解的2个要点:

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量

总结:指针就是地址,口语中说的指针通常指的是指针变量

 

 一个字节一个精确的地址,就像一户人家一个门牌号,这样我们就能通过门牌号找到里面的人

1,一个小的单元到底是多大?(1个字节)

因为经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。   

2,如何编址?  

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0)

那么32根地址线产生的地址就会是: 
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
...
11111111 11111111 11111111 11111111
这里就有 2 32 次方个地址。
每个地址标识一个字节,那我们就可以给 4G 的空闲进行编址。64 位机器,如果给 64根地址线,就可以给 4G 的空闲进行编址。
这里我们就明白:
32 位的机器上,地址是 32 0 或者 1 组成二进制序列,那地址就得用 4 个字节的空间来存储,所以
一个指针变量的大小就应该是 4 个字节。
那如果在 64 位机器上,如果有 64 个地址线,那一个指针变量的大小是 8 个字节,才能存放一个地
址。
总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的
指针的大小在 32 位平台是 4 个字节,在 64 位平台是8个字节

二,指针和指针类型

1,指针运算符

  • 取地址运算符&: 用来取对象的地址   栗:&i为取变量i的地址
  • 间接访问操作符 * : 与&相反,操作对象地址,获取地址存储的内容    栗:a=&i,指针变量a 存储变量 i 的地址,*a 则是找到指针变量a存储的地址,然后将内容取出。

2,指针类型的意义

char  *p

int   *p

short *p

long  *p

float *p 

double *p

这里我们可以看到,指针类型的定义就是:类型就是  +  * 

  • char* 类型的指针是为了存放 char 类型变量的地址
  • int* 类型的指针是为了存放 int 类型变量的地址
  • 也就是什么类型的指针就是为了存放相应类型的地址 

那指针类型的意义是什么? 

实验1:

这里我们查看了编译器中 a 的内存大小(右边红字部分),初始值是0x11223344

 经过int * 类型的指针,赋值后四个字节都变成了0。

 这里我们将指针类型变成了char * ,结果只有一个字节变成了0,

 实验2:

#include<stdio.h>
int main()
{
	int n = 10;
	char* p1 = (char*)&n;
	int* p2 = &n;

	printf("%p\n", &n);       //000000917452F804

	printf("%p\n", p1);       //000000917452F804

	printf("%p\n", p1 + 1);   //000000917452F805

	printf("%p\n", p2);       //000000917452F804

	printf("%p\n", p2 + 1);   //000000917452F808
	return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值