初步了解指针呀


指针


一、指针是什么?

指针是什么?
指针理解的2个要点:
1.指针是内存中一个最小单元的编号,也就是地址。
2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量。
3.指针变量
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量。

#include <stdio.h>
int main()
{
 int a = 10;//在内存中开辟一块空间
 int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
             //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
中,p就是一个之指针变量。
 return 0;
}

总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台是4个字节,在64位平台是8个字节。

二、指针类型,指针所指类型,指针的值

1.指针类型

从语法角度看,把指针声明语句里面的指针变量的名字去掉,剩下的就是指针的类型。

char  *pc = NULL;   //指针的类型是char*
int   *pi = NULL;	//指针的类型是int*
float *pf = NULL;	//指针的类型是float*
double *pd = NULL;	//指针的类型是double*
int    **pc=NULL;   //指针类型是int**
int (*par)[3];    //指针类型是int (*)[3]
int *(*par)[4];   //指针类型是int *(*)[4]

这里可以看到,指针的定义方式是: type + * 。
其实:
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。

2.指针所指类型

从语法角度看,就是把指针声明语句中的指针变量的名字和名字左边的指针声明符*去掉,剩下的就是指针所指的类型了。

char  *pc = NULL;   //指针所指的类型是char
int   *pi = NULL;	//指针所指的类型是int
float *pf = NULL;	//指针所指的类型是float
double *pd = NULL;	//指针所指的类型是double
int    **pc=NULL;   //指针所指的类型是int*
int (*par)[3];    //指针所指的类型是int ()[3]
int *(*par)[4];   //指针做值得类型是int *()[4]

3.指针的值

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

三、指针的算术运算

1.指针±整数

#include <stdio.h>
//演示实例
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;
}

总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。

2.指针-指针

代码如下(示例):

int main()
{
	int arr[10] = { 0 };
	//取出数组第一个元素和最后一个元素的地址
	int* start = arr;
	int* end = &arr[9];
	printf("%d\n", end - start);
	return 0;
}

总结:指针-指针得到的是差的元素的个数。(例子中的10-1=9个元素)

四、运算符&和*

&是取地址运算符,*是间接运算符

int a=10; int*p; int **ptr;
p=&a;     //&a的结果是一个地址,类型是一个指针,指针类型是int*,只想的是int,指向的是a的地址
ptr=&p;   //&p 的结果是个指针,该指针的类型是p*,
**ptr=4;  //*ptr的结果是一个指针

五、指针与数组的关系

1.指针数组

1.指针数组:存放指针的数组就是指针数组

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;

	/*int* pa = &a;
	int* pb = &b;
	int* pc = &c;*/
	int* parr[10] = { &a,&b,&c };		//指针数组
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%d ", *(parr[i]));
	}

2.数组指针

int *p1[10];
int (*p2)[10];
//p1, p2分别是什么?

解释:
int (p)[10];p先和结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个
指针,指向一个数组,叫数组指针。
//这里要注意:[]的优先级要高于号的,所以必须加上()来保证p先和结合。

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值