博主简介:是瑶瑶子啦,一名大一计科生,目前在努力学习C进阶,JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛!
所属专栏:C/C++
✈往期博文回顾:进入内存,透彻理解数据类型存在的意义,整形在内存中存储,大小端字节序,浮点型在内存中存储
️♂️近期目标:成为百粉小博主。持续输出:C进阶、JavaSE,数据结构、算法相关的优质博客,
♀️写博客理念:力求用通俗语言去阐述知识知识、技术。喜欢画图、思维导图去描述过程和知识之间的联系。
您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
:“再牛的程序员也是从小白开始,既然开始了,就全身心投入去学习技术”
♀️Write int the front
:也许你是将将学C,而为指针百思不得其解的童鞋,也许你是已经玩转指针的大佬~但不管怎么样,我相信,看完这篇文章,一定会对你对指针的理解有很大很大的帮助!让你使用指针的每一步都有满满的安全感!话不多说,咱们即刻启程!
不知道你学指针的时候有没有这样的疑问,指针变量前面的这个"*"星号是什么,解引用的这个“*”和又是什么,和前者是一样的吗?初次听到“指针”这个“高级名词”是不是也“不寒而栗”(好高级的名字,而且别人都说指针最难学啦–瑶瑶子的亲身感受哈哈)。学校里面老师说“这是行指针,这是列指针,记下来吧,没有别的办法”–(碎碎念:瑶瑶子高程老师说的,我内心:???)
(真的没有骗大家,学校里的高程教材!!!老师居然让我把这些全部记下来?????)
️♀️这一part,瑶瑶子将带领大家,掀开指针的神秘面纱,通俗移动的解释清楚什么是指针!
虽然上面一直在说指针就是地址,它也确确实实是地址,但是我们更多的时候,说的这个“指针”,指的是指针变量.
通常," * "会在两种情景下出现:
1.指针变量声明时:
int a=0;
int *p=&a;
2. 指针被解引用时
int *p=&a;
*p=2;
type
,表示的是,p指针变量所指向的那个变量(对象)的类型。可以这样理解,比如一个教室里有学生和老师,一个叫小A的同学坐在3排5列的地方,老师想让小A起来回答问题,可以说:小A,你来回答以下问题(喊名字),也可以说:3排5列同学,你来回答一下问题(通过地址,间接找到A)。
♀️我们知道,指针变量里面存放的数据是地址,之前文章里我提到过,一个变量的类型同样也表示着所存数据的类型(所以通常讲嘛“XXX变量的数据类型是…")。but ,地址数据有类型吗?答案当然是没有的,地址数据,本身无类型可言,但是指针变量所指向的对象一定有确切的数据类型,由此通常将指针变量所指向对象的数据类型,称为指针变量的数据类型.(说是这么说,但是一般我们还是认为声明变量的时候,去除变量名,剩下的就是变量的数据类型)。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a = 0;
int *pa = &a;
printf("%p--> %p\n", pa,pa + 1);
char b = 0;
char *pb = &b;
printf("%p--> %p", pb, pb + 1);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a = 0;
int *pa = &a;
int* pa2 = pa + 1;
printf("%d", pa2 - pa);//1
return 0;
}
int a=0;
int *pa=&a;
*a=1;
♀️在进行Part3之前,请你反问自己几个问题,如果都能回答上来,说明已经对指针有很大掌握了~
♂️有了指针,上面我们提到对于指针变量,有个特有的操作:解引用。所以通过对指针变量解引用,我们可以用指针变量来访问数组元素。
❗注意:由于[ ]的优先级高于*.所以要用括号括起(*p)来表示p是指针。否则p先和[ ]结合,p就代表是个数组了。
int arr[3]={0,1,2};
int *pa=arr;
*(pa+2)=3;
printf("%d",a[2]);
//3
♀️:碎碎念:这个名字听起来确实还太高级的,但是不要被它吓住了!!!在理清什么是二级指针之前,我们先理清以下概念:
♀️弄清楚上面之后,二级指针,其实就是指针变量的地址!
int a=0;
int *pa=&a;
int **ppa=&pa;
♀️首先,你需要明确以下几点:
类比:char arr[10];arr是字符数组,存放元素类型是字符
int main()
{
int *arr[5];
//arr和5结合,说明arr是数组,该数组元素类型是int *
}
♀️在这之前,你需要知道的:
♂️引入:由于C语言中没有字符串类型,所以,常量字符串用常量字符指针来接收。
所以我们经常能看见:
const char *p="hello";
♀️你需要知道的:
♀️首先,你必须明确的:
int main()
{
char arr[2][3] = { {'a','b','c'},{'d','e','f'} };
char(*parr)[3] = arr;
}
int arr[3]={1,2,3};
int (*parr)[3]=&arr;
int *p=arr;
相同点:
不同点:
♀️这里讲其中一个用法:使用行指针打印二维数组。
int main()
{
int arr[2][3] = {1,2,3,4,5,6};
int (*p)[3] = arr;
for (int i = 0;i < 2;i++)
{
for (int j = 0;j < 3;j++)
{
printf("%d",*(p+i)[j];
}
}
return 0;
}
♀️如何理解*(p+i)[j]
(对照上方的图,把char转成int就行)
♀️你必须明确的,什么类型变量可以接收数组传参
int main()
{
char arr[3]={'a','b','c'};
test(arr);
return 0;
}
3种接收方式:
void test (char arr[]);
void test (char arr[3]);
void test (char *arr);
int main()
{
char arr[2][3]={'a','b','c','e','f','g'};
test(arr);
return 0;
}
3种接收方式:
void test(char (*arr) [3]);
void test(char arr[2][3]);
void test(char arr[][3];
♂️:注意,二维数组传参,用二维数组来接收时 ,行参数可以省略,列参数不能省略。其实还是用之前的想法,把二维数组看作一维数组。那么数组的一个元素类型就是一维数组,不知道该一维数组长度(就是二维数组列长)就相当于不知道一个一维数组的数组元素的类型一样。
易错!!
char ** arr
来接收?你需要知道的:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int x, int y) {
return x + y;
}
int main() {
int (*p)(int, int) = add;
//返回类型 //形参1,2类型
return 0;
}
建议:表示指针时,最好都用(*p)这种括号来明确,否则指针变量一不小心就和其他符号结合了哟~
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int x, int y) {
return x + y;
}
int main() {
int (*p)(int, int) = add;
//返回类型 //形参1,2类型
int ret=p(1,2);
return 0;
}
write in the end
以上就是指针基础知识的全部内容了!!!
理解好了指针,用起来安全感也会up up up!
♀️再也不会畏惧指针啦,相信你下次看到指针,内心:区区指针,你占多少字节,指向什么类型的变量,我都看的看的透透的!!
♀️原创不易,画图不易,如果有帮助,还请多多点赞,关注,收藏,评论~咱们下期见