关于学数据结构前需要掌握的C知识总结(指针2)

接关于学数据结构前需要掌握的C知识总结(指针1)

1. 用数组名作为函数参数
在之前我们已经说过了实参数组名代表的是数组首元素的地址,而形参是用来接收从实参传递过来的数组首地址的,所以形参应该是一个指针变量,C编译都是将形参数组名作为指针变量来处理的。例:
void fun (int arr[],int n);
void fun(int * arr,int n);
这两种写法就是等价的。
下面我们用一段完整的代码来看看数组名是如何作为函数参数的

#include<stdio.h>
void fun(int arr[], int n){
int* p = arr,i;
for (i = 0; i < 10; i++, p++) 
	printf("%d", *p);
		printf("\n");
for (i = 0; i < 10; i++)
	printf("%d", arr[i]);
		printf("\n");
		}
void fun_1(int *arr, int n){
int* p = arr, i;
for (i = 0; i < 10; i++, p++)
	printf("%d", *p);
printf("\n");
for (i = 0; i < 10; i++,arr++)
	printf("%d", *arr);
printf("\n");
p = arr;}
int main()
{
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
fun(a, 10);
fun_1(a, 10);
return 0;
}

在这里插入图片描述

从运行结果我们可以看出这两种写法确实是等价的,至于变量的加减等在上一篇中已经提到,这里就不再解释了。
2.通过指针引用多维数组
太多维的数组大家可能不熟悉,咱们这里只介绍二维数组,二维数组的基本概念以及用法想必大家都已经很清楚了,这里的难点就在于当用指针引用多维数组时候的运算。

int main() {
int a[3][3] = { 1,2,3,
				4,5,6,
				7,8,9 };
int* p = &a[0][0];
printf("%d,%d,%d", a,&a,p);	printf("\n");
printf("%d,%d", a+1, p+1);	printf("\n");
printf("%d,%d", *a, *p);	printf("\n");
printf("%d,%d", *a+1, *p+1);	printf("\n");
printf("%d,%d", &a[1][1], *(p + 1)+1);	printf("\n");
printf("%d,%d", *(a + 1), *(p + 1));	printf("\n");
printf("%d,%d", (*a) + 1, (*p) + 1);	printf("\n");
printf("%d,%d", *(a + 1)+1, *(p + 1)+1);printf("\n");
return 0;

}在这里插入图片描述
差不多都在这里了,可能有点多,但是如果边看代码边看运行结果的话应该不是特别难懂,接下来说明一下各行代码都是什么意思,为了让大家看的明显,这里的二维数组被我分列打出来了。

a,p,&a,*a代表的是0行首地址和0行0列的首地址,其实是一个地址,只不过换了个说法而已。

a+1, p+1代表的是1行首地址,因为每行的元素有三个,
每个元素都是整形占4个字节,所以多出12个字节,
这里要说明一下,行和列是我们为了方便说明多维数组而加上去的一个概念,
在真实的计算机中,数组数据的储存是连续的,并不存在所谓的行列。

* a+1和  * (a + 1)相同是因为 *  的优先级比+要高;

其他的大家进行对照就能很明显的看出是什么意思了。

在C语言中因为规定了下标从0开始,所以如果有一个二维数组a[i][j],且知道i和j的值,就可以用i*m+j公式计算出a[i][j]相对于数组开头的相对位置。

3. 通过指针引用字符串
用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串。
(1)char*string=“ABC”
(2)char *string;
string=“ABC”;
这两个是等价的,其中第二种方法中并不是把所有字符的地址存进去了,而是只放入了第一个元素的地址。那有人会问既然只放入了一个地址,有没有其他的,怎么会输出整个字符串呐? 其实系统会自动使string加1,使之指向下一个字符,直到遇到字符串结束标志‘\n’为止。
4.字符指针作为函数参数

  1. 以字符数组作为形参与实参调用
  2. 以字符数组作为形参,以指针作为实参调用
  3. 以指针作为形参与实参调用

其实这个的话和数组名作为函数参数是有些是一样的,大家只需要知道有这三种方法就可以了,我们在数据结构里,就单论入门来说都是整形的,放几个代码简单看看就可以了,对于指向函数的指针,返回指针值的函数,指针数组和多重指针等在这里就不多加以介绍了,以后就时间的话详细说一下这些东西。

#include <stdio.h>
void char_Copy(char* p, char* q)
{
	for (; *p != '\0'; p++)
	{
		if (*p == 'A' || *p == 'E' || *p == 'I' || *p == 'O' || *p == 'U')
		{
			*q++ = *p;
		}
	}
	*q = '\0';
}
void main()
{
	char a[20], b[20];
	scanf_s("%s", a);
	char_Copy(a, b);
	puts(b);
}
#include <stdio.h>
void del_char(char* q, char x)
{
	char* ptr;
	for (ptr = q; *ptr != '\0'; ptr++)
		if (*ptr != x)
			*q++ = *ptr;
	*q = '\0';
}

void main()
{
	char a[20], c;
	printf("input string :\n");
	gets(a);
	printf("input delete char : ");
	c = getchar();
	del_char(a, c);
	puts(a);
}
#include <stdio.h>
void fun1(int x,int y)
{
	int t;
	t=x;
	x=y;
	y=t;
	printf("%d %d\n",x,y);
}
void func2(int *x,int *y)
{
	int *t;
	t= x;
	x=y;
	y=t;
	printf("%d %d\n",*x,*y);
}
void main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	fun1(a,b);
	func2(&a,&b);
}

关于指针的知识点,知道这些学习数据结构其实就没多大问题了,下一个的话就是结构体的一些东西,结构体的东西要比指针要少,数据结构那本书的基础是链表,之后将结构体的知识整理之后,就开始说说链表的一些东西。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值