【C语言---指针(2)】

一.数组名的理解

   总结:

  • 数组名就是首元素的的地址,即arr==&arr[0]。不过该说法有两个例外:sizeof(数组名)        和&数组名中表示的是取出整个数组的地址。除此之外,都表示的是首元素的地址。

1.使用指针访问数组

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (int i = 0; i < sz; i++)
	{
		scanf("%d", p + i);
	}
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

2.一维数组传参的本质

本质上数组传参的本质是传递的是数组首元素的地址

#include <stdio.h>
void test(int* p)
{
	printf("%d", sizeof(p));//计算的是一个指针变量的大小
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	test(arr);
	return 0;
}

故,一维数组传参,形参的部分可以写成数组的形式,也可以写成数组的形式。 

3.二维数组传参的本质

二维数组传参的本质就是传递了地址,传递是第一行这个一维数组的地址。

PS:二维数组的传参,形参部分可以写成数组,也可以写指针的形式。

#include <stdio.h>
void test(int(*p)[5], int r, int c)//这里的地址就是二维数组首行元素的地址
{
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	test(arr, 3, 5);
	return 0;
}

二.二级指针

PS:指针变量也是变量,是变量就有地址。一级指针变量的地址就是用二级指针存储的。

#include <stdio.h>
int main()
{
	int a = 10;
	int* p1 = *&a;
	int** p2 = &p1;
	return 0;
}

 

三.字符指针变量

字符指针类型  char*.

一般使用:

#include <stdio.h>
int main()
{
	char ch = 'w';
	char* p = &ch;
	*p = 'a';
	printf("%c", ch);
	return 0;
}

四.指针数组,数组指针变量

对于字符指针和数组指针用类比的方法:

1.整型数组,是存放整型的数组;字符数组是存放字符的数组。

那么指针数组就是存放指针的数组,指针数组的每个元素都是用来存放地址(指针)的

指针数组的每个元素是地址,又可以指向一块区域。eg:int *arr[5].

2.数组指针变量属于指针,同样我们由类比的方法可以知道数组指针变量存放的是数组的地址,能够指向数组的指针变量。eg:int (*arr)[5].

这里要注意:

[ ]的优先级要高于*号的,所以必须加上()来保证arr先和*结合。

 1.指针数组

使用指针数组模拟二维数组

#include <stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	int* parr[3] = { arr1,arr2,arr3 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 

2.数组指针 

数组指针类型解析:

1    int     (*)      [10]  =  &arr;

2      |       |          |

    |       |          |

4      |       |         p指向数组的元素个数

    |      p是数组指针变量名

6      p指向的数组的元素类型

五.函数指针变量,函数指针数组

函数指针变量就是用来存储函数的地址的,函数指针数组就是将函数的地址放在数组中。

函数指针变量:

int   (*p)   (int x,int y)

|              |             |

|              |            p指向函数的参数类型和个数的交代

|             函数指针变量

p指向函数的返回值类型

#include <stdio.h>
void add(int x, int y)
{
	return x + y;
}
int main()
{
	int (*p)(int, int) = add;
	printf("%d\n", (*p)(2, 3));
	printf("%d\n", p(2, 3));//这两种的调用方式是等价的
	return 0;
}

函数指针数组:

eg:int     (*arr[3])    (  )

p先和[ ]结合,说明是数组,数组的内容是int (*) ( )类型的函数指针。

 指针内容较多,但需认真理解,多加揣摩!

以上内容如有错,还望指正!关注博主,优质内容不断更新!

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小峰编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值