C语言指针详解(2)-- 指针的加减运算,指针在数组中的访问,二级指针,以及指针数组的简单介绍。

目录

目录

一.指针运算

1.指针的加减运算

2.指针减指针运算

 二.指针遍历数组

三.二级指针 

四. 指针数组 

1.定义

2.使用方法



一.指针运算

1.指针的加减运算

int main(){
int a[10] = { 1,2,3,4,5,6,7,8,9,10};
	int i = 0;
	int sz = sizeof(a) / sizeof(a[0]);
	int* p = a;//利用指针遍历数组
	for (i = 0; i < sz; i++) {
		printf("%d ", *p);
		p = p + 1;//指针加
	}
    return 0;
    }

        上面的代码是让指针指向数组a,此时指针指向的是数组首元素的地址, 通过循环的方式指针每输出一次,就让指针指向下一个元素的地址,从而遍历完整个数组。

 注意:*p是地址对应数组里边的值,p则单纯是指地址。

2.指针减指针运算

int arr[10] = { 0 };
			printf("%d\n", &arr[9] - &arr[0]);//?
			printf("%d\n", &arr[0] - &arr[9]);//?

        以上代码表示:创建了一个拥有10个元素的数组,然后相互计算起始位置的元素与末尾位置的元素互相减去的结果 。

 

代码结果:两指针(指向首元素的地址与指向末尾元素的地址)相减的结果其实是指针之间的元素个数。所以上面两行的代码值为9与-9。 

        我们可以通过结果看出,末尾元素 ——起始元素的值为正数,而起始元素——末尾元素的值则相反。计算指针与指针之间的关系运算:1.必须是遵循大地址——小地址(否则为负数);

2.只能是计算指针之间的减法;3.必须是同一数组间才能进行指针相减运算(下图为相反的例子,结果出错)。

int my_strlen(char* str)
{
	char* start = str;//首元素地址
	while (*str != '\0')//最终str会到末尾
	{
		str++;
	}
	return (str - start);
}

         上图代码也是末尾指针减起始指针。


 二.指针遍历数组

int main()
{
	int arr[10] = {0};
	//arr 是首元素的地址
	//&arr[0]
	int* p = arr;
	//通过指针来访问数组
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;

	for (i = 0; i < sz; i++)
	{
		printf("%p ----- %p\n", &arr[i], p + i);
	}

	return 0;
}

      1.  所以 p+i 其实计算的是数组 arr 下标为i的地址。 

int main()
{
 int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 int *p = arr; //指针存放数组首元素的地址
 int sz = sizeof(arr) / sizeof(arr[0]);
 int i = 0;
 for (i = 0; i<sz; i++)
 {
 printf("%d ", *(p + i));
 }
 return 0;
}

      2.  那么p+i通过解引用操作就可以变成arr[i] 元素的值 。

 通过以上两个例子可得指针与数组的等价关系:

                                arr[i]<==>*(p+i)<==>*(arr+i)

                                 p+i  <==> arr+i <==> &arr[i]


三.二级指针 

        在之前,我所讲的所有指针都是一级指针,如下图,是一级指针的使用方法。一级指针就是创建指针变量去关联变量的地址,从而间接影响变量的值。

int a = 10;
	int* pa = &a; //取地址
	*pa = 20;    //解引用
	printf("%d\n", a);

        那么指针变量也是变量的一种表示形式,是变量就会有地址。那我们就可以使用指针变量去关联指针变量的地址,由此衍生出来二级指针。(说白了就是套娃操作!hhh) 

int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	**ppa = 200;
	printf("%d\n", a);

        如右图:一级指针pa存放变量a的地址,二级指针ppa存放一级指针变量pa的地址。

        解析指针语句:int* pa中,pa是变量名,*号表示指针,int是说pa指向的对象类型是int型。

        int* * ppa中,ppa是变量名,第二个指针表示ppa是指针,而int*表示ppa指向的对象类型是int*类型的。

二级指针的运算:

        **ppa=200;其实可以写成  *(*pa)=200; 

        *ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa . 

        **ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .

以上就是二级指针的讲解。


四.指针数组 

1.定义

        指针数组说白了就是数组,就好比好孩子,主语是孩子。指针只是形容词,指针数组就表明数组中存放的全是指针类型的元素。

         上图为普通数组的存放方式,通过创建一个数组,将其三个变量放在数组中。那么指针数组也是如此。如下图:

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

	int arr[10];

	int* pa = &a;
	int* pb = &b;
	int* pc = &c;

	//parr就是存放指针的数组
	//指针数组
	int* parr[10] = { &a, &b, &c };

	int i = 0;
	for (i = 0; i < 3; i++)//0 1 2
	{
		printf("%d ", *(parr[i]));
	}
	return 0;
}

        

 2.使用指针数组去转换二维数组

int main() {
	int a1[] = { 1,2,3,4 };
	int a2[] = { 2,3,4,5 };
	int a3[] = { 3,4,5,6 };
	int* par[] = { a1,a2,a3 };//使用指针数组去接收三个数组,a1,a2,a3指向的都是各数组的首元素地址
	int i = 0;
	printf("par[]:\n");
	for (i = 0; i < 3; i++) {
		int j = 0;
		for (j = 0; j < 4; j++) {
			printf("%d ", par[i][j]);
		}
		printf("\n");
	}

	return 0;
}

 关于指针,我就讲到这里了,觉得有用的话,点个关注吧! 谢谢

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙予清的zzz~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值