C语言指针解析

指针

我们通常把指针变量叫做指针,准确的说,这样的理解是错误的。首先我想在这里明确一下指针与指针变量是两个概念。

  • 指针:
    一个变量的地址指出了变量的存储单元在内存中的具体位置,能对变量进行存取操作。这个变量的地址就是变量的指针。

  • 指针变量:
    指针是一种具有特殊意义的整型数,指针不能存放在一般的整型变量中,必须存放在专门指针的变量中,这类变量就是指针变量。

	int i = 10;
	int *p = &i;
	return 0;

在这段代码中 i 是一个整形变量, p 是一个指针变量,存放着 i 的地址,&i 是一个指针。

指针变量

  • 指针的定义
    C 语言规定所有变量在使用前必须先定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门用来存放地址的,所以必须将它定义为“指针类型”。

  • 指针变量定义的一般形式为:
    基类型 *指针变量名;

  • 例如:

int* p
char* p
double *p
...
  • 指针的大小
    一个指针变量在内存中占4字节或8字节(32位平台或64位平台)。
  • 操作符 ‘ * ’
int i=10;
int *p=&i;

在上面这段代码中,指针变量p中存的是整形变量i的地址,我们可以通过 *p来读取到i的内容。

  • 有这样一个问题我觉得有必要在这里讲清楚
    以整形为例,我们知道一个int型的数据在内存中占四个字节,指针变量p存的是整形变量i的哪一个字节的地址呢?
    在内存窗口和监视窗口中取出i的地址和p的内容我们可以看出,答案是最低字节的地址

在这里插入图片描述
在这里插入图片描述

  • 指针+ - 整数
int main()
 {
       int n = 10;
       char *pc = (char*)&n;
       int *pi = &n; 
       printf("%p\n", &n);
       printf("%p\n", pc); 
       printf("%p\n", pc+1);
       printf("%p\n", pi);
       printf("%p\n", pi+1);
       return  0; 
 } 

在这里插入图片描述
通过这段代码我们可以看出,指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用 就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

  • 指针-指针
 	int main()
{
	int arr[5] = { 0 };
	int *ps = &arr[0];
	int *pe = &arr[4];
	printf("%d\n", pe - ps);
	system("pause");
	return 0;
}

在这里插入图片描述
我们把数组类型换成char试试:
在这里插入图片描述
结果还是4,由此我们可以得出一个结论:
指针-指针所得出的结果是两指针之间元素的个数

	这里要注意指针-指针的前提条件是指向同一块内存空间
  • 二级指针
    指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针
int i=10;
int *p=&i;
int **pa=&p;

在这段代码中,pa就是一个二级指针,其内容为p的地址,对pa进行解引用操作可以找到p中的内容,即i的地址,在对齐进行解引用操作可以拿出i的值,也就是说,*p和**pa以及i的值是相同的

  • 指针与数组
    既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值