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语言指针系列的主要内容,如果未能解决你的问题,请参考以下文章