C语言指针系列

Posted Jack Chao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针系列相关的知识,希望对你有一定的参考价值。

C语言指针系列(二)

在经过上次的讲解之后,我经过了学校的考试周。考试结束之后,也是加急赶了这篇文章来和大家讨论指针。
我们上次已经了解到了什么是指针。我们最后的目标是灵活运用指针,在此之前我们还有很多的只是需要学习。
在讲正文之前,我们先了解一下指针的大小。
我们在学习C语言的时候,我们知道列如:int,double,long等等定义的变量都是有大小的。如果不知道可以看看我的《C语言学习,从入门到进阶系列》
那我们之前知道大小是不是用到了sizeof()这样的函数。那在这里也是一样的。
那我们话不多说,先上代码

#include<stdio.h>
int main()
{
	int a = 10;
	int* p = &a;
	printf("%d", sizeof(p));
	return 0;
}

这个代码,大家应该还算熟悉的。
那我们在运行之后我们会有这样的结果。
在这里插入图片描述
但是有些人或许会比较疑惑了,因为他们的结果是这样的
在这里插入图片描述
怎么会这样呢?怎么会一个4一个8呢?
我们可以在两个照片里面找不同。
揭晓答案的时刻来了
在这里插入图片描述
在这里插入图片描述
不知道你有没有发现这个地方的不一样。
那是为什么呢?其实是平台的问题。你想想,你在外面买东西的时候,买不同品牌的相同产品是不是也不一样的呀,要是一样的,那岂不是抄袭。所以平台影响到了指针变量的大小。
那我们来看看接下来的这段代码

#include<stdio.h>
int main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d", *a);
	return 0;
}

我们来看看这段代码的输出结果是什么呢?
揭晓答案:
在这里插入图片描述
那为什么是1呢?
其实,在了解这个之前我们先要了解数组这个概念。数组其实就是连在一起的一个个箱子,箱子里面可以放好多好多的东西。每个箱子都有地址。其实数组在一定形式上来说也是指针。在代码里面的那个单单的一个a字母的意义是什么呢?其实他就是首元素的地址。首元素是什么?就是a[0];所以配上*这个符号之后,我们就可以通过这个符号找到这个值了。
那我们拓展一下,a[1],a[2],a[3]这种我们应该怎么表示呢?现在大家好好想想,我们会在文章的最后告诉大家。
我们还需要辨别两个概念:数组指针和指针数组,这两个概念。
我们来看看最容易弄混的一个点:他们两个哪个是指针哪个是数组?
答案揭晓:数组指针是指针,指针数组是数组。
那我们怎么更容易分辨这两个呢?
这边有一个很有意思的点:好孩子是什么?大家或许会说,好孩子当然是孩子啦。不管坏孩子,好孩子,高孩子,矮孩子。都是孩子呀。
对,我们就这样想。是不是还挺容易理解的呢?就是看本质是什么,我们先看谁在后面出现。就像是老大一样。一部剧,最后的幕后老大总是最后才出现的嘛。
那我们先来看看这两个都长什么样子

#include<stdio.h>
int main()
{
	int* p1[10];
	int(*p2)[10];
}

这两个是不是长的还挺像的,我们怎么来分辨呢?
首先,我们都知道单目操作符号都是从左到右的,这个跟一般的加减乘除不一样。那我们看p1。他是先跟[]这个结合在一起,说明他是数组。这个数组有10个元素,每个元素的类型都是int*;是指针数组
那我们看p2。首先因为()的缘故,他是先跟*结合的,所以他是指针。然后指向的是一个大小为10的int类型的数组。是数组指针。
所以我们可以知道,谁先结合,谁就是占主导的。
那我们可以区分之后我们来看看怎么应用的。

#include<stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int c = 3;
	int* p1[3] = {&a,&b,&c};
	printf("%d", **(p1+1));
}

我们先看到的这个是指针数组。它可以保存多个指针。他的用处也是这个。

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

这两个代码我们可以比较一下。两个代码都是输出二维数组的。可是两个代码的条数是不一样的。第一条是我们普通的写法。
第二种是学习过指针数组的写法。而且指针数组大多应用于自定义函数的地方。
差不多到最后了,预祝大家可以越来越厉害,我们一起进步。
最后的最后,谢谢大家的阅读。

以上是关于C语言指针系列的主要内容,如果未能解决你的问题,请参考以下文章

C语言指针系列

C语言指针系列

知识分享:C语言知识系列——指针篇

C语言指针系列

C语言指针系列

C语言指针系列——并不可怕的声明