初识指针篇

本文介绍了C语言指针的基本运算,包括指针加减整数、指针关系运算和指针相减。接着讲解了二级指针的概念,以及字符指针的特性,指出在特定情况下,指向相同常量字符串的不同指针实际上是相等的。最后,讨论了指针数组的使用,并通过示例展示了其类似二维数组的操作方式,强调了指针在数组运算中的灵活性。
摘要由CSDN通过智能技术生成

上篇博客已经介绍过指针是什么,这篇简单讲解一下指针的基本运输和指针数组

目录

1、指针的基本运算

1)指针+-整数

2)指针的关系运算

3)指针相减

2、二级指针

3、字符指针

4、指针数组




1、指针的基本运算

我们已经知道了指针类型决定指针允许访问空间的大小

1)指针+-整数

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;
}

打印结果

00CFFBDC       n的地址
00CFFBDC       pc中存放的是a的地址
00CFFBDD       pc是char*类型,所以pc+1,是地址+1,访问下一个字节
00CFFBDC       pi中存放的是a的地址
00CFFBE0        pi是int类型,所以pi+1,是地址+4,跳过4个字节,访问下一个整型

2)指针的关系运算

#define N_VALUES 5
float values[N_VALUES];

//指针+-整数;指针的关系运算
int main()
{
    float* vp;
    for (vp = &values[0]; vp < &values[N_VALUES];)
    {
        *vp++ = 0;
    }
}

 指针作比较:指针也是有大小的,有高地址和低地址之说,是地址作比较,不是数组元素比较

C语言标准规定:允许指针与指向数组的最后一个元素后面的那个地址进行比较,不允许指                                向数组第一个元素前面的地址进行比较。

3)指针相减

int main()
{
	int arr[] = { 1,2,6,7,8,9,10,11 };
	int* p1 = &arr[1];
	int* p2 = &arr[6] ;
	printf("%d", p2 - p1);
}

打印结果:5

 指针相减得到的是两个指针之间的元素个数,这并不是地址相减的结果。

2、二级指针

指针是用来储存地址的变量,但指针也是变量,那么谁来存放指针的的地址呢?--用二级指针来存储。

int main()
{
	int a = 10;
	int* p = &a;
	int** prt = &p;
	printf("%d", **prt);
}

 打印结果:10

*ptr = p,*p = a;所以**ptr = a,两次解引用即可

3、字符指针

void cmp(char* m, char* n)
{
	if (m == n)
	{
		printf("相等\n");
	}
	else
	{
		printf("不相等\n");
	}
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	cmp(arr1, arr2);
	char* p1 = "abcdef";//常量字符串,只会开辟一块存储空间,因为不能修改,所以是它们的
	char* p2 = "abcdef";//地址相同,指向同样的内容。
	cmp(p1, p2);
	return 0;
}

输出结果: 不相等
                   相等

arr1和arr2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以arr1 !=arr2。而p1和p2是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,p1和p2指向的是同一个常量字符串,所以p1 == p2。

4、指针数组

 指针数组本质上是个数组,即存放指针的数组:

int arr[10]     整型数组

char  arr[10]  字符数组

int * arr[10]    指针数组

 如何使用指针数组:

int main()
{
	int arr1[] = { 1,2,3,4,5,};
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	//arr是指针数组
	int* arr[] = { arr1,arr2,arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			//printf("%d ", arr[i][j]);
			printf("%d ", *(arr[i] + j));
		}
		printf("\n");
	}
    return 0;

}

 输出结果;

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7

是不是类似一个二维数组?

我们知道数组名一般情况下是数组首元素地址,当访问到arr[0]的时候就是arr[]中的第一个元素arr1了,arr1数组名就是数组arr1的首元素地址,arr1[0]的地址,如果arr[0]+1就访问到arr1[1]的地址,解引用后就是2。*(*arr[0]+1) = arr[0][1]。

数组实际上就是指针的操作,*(arr[0]+1) = arr[0][1]  有可能有点难以理解,举个例子,如果是一维数组,即p[0] = *(p+0),如果是p+1则访问p[1], 即地址+1,就跳过一个整型元素,访问下一个元素。

下列代码输出结果为:1

int main()
{
	int p[] = { 1,2,3,4 };
	printf("%d", *(p + 0));
	return 0;
}

 指针在数组上的运算尤为重要,他现了C语言的灵活性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值