11.11 早上 指针数组和数组指针、为什么scanf函数要取地址

发布于 22 天前  27 次阅读


指针数组是一个数组,它的元素都是指针;数组指针是一个指针,它指向数组

指针数组:int* p1[5] ={p,...},其中p是指针

中括号的优先级高于星号,这其实是理所当然的(毕竟是括号)

所以p1会优先与中括号结合,构成一个数组的定义,所以这就是表示数组中的元素类型都是int型的指针

但它是一个数组,因为这里的int*声明和修饰的是数组里面的内容,而不是声明定义一个指针

//可能当时了解数组定义的时候忽视了!type:这里表示数组中元素的类型(例如 int、float、char 等),出现[ ]就已经说明了这是数组,数组可以被视为一种复合数据类型。而在 C 语言中,数组本身就是一种特殊的变量类型

数组指针:int (*p2)[5] =&arr

小括号的优先级比中括号高,*和p2构成了一个指针定义,而int修饰的是数组里的内容,即数组中的元素类型是int类型,数组指针是指向数组的指针。它可以用来访问数组中的元素

//只要记住,数组名加上了解引用符号就不是数组,是一个数字指针了


为什么scanf函数要取地址?

在说明原因之前,我们要先弄明白C语言函数的一个机制

函数传参传的是一个副本

也就是说函数调用的时候传递的参数在函数中处理的时候并不是原来的那个变量了,而是它的一个拷贝

//唉,一直写这个,重复几遍了

为了解决形参不能改变实参这个痛点,我们需要使用指针,我们使用指针作为函数传递的参数

但请注意,这里传递的指针在函数处理的时候也是一个拷贝,也不是原来的那个指针变量了但是该指针指向的变量和原指针所指向的变量是一致的(也就是说他们取的地址是相同的

我们再来看下scanf函数,它本质也是一个函数,这个函数既然想要改变传入变量的值,那么肯定要传入指针,所以要取地址

//说的太清楚了!GREATNESS!

届ける言葉を今は育ててる
最后更新于 2024-11-11