对多维数组名、指向数组的指针和指针数组的理解

  今天新开的博客,有点小激动。。。。。。听说要成为一个好的程序员必须要写博客,虽然不太明白为什么,但就当写日记好了。。。

写之前先#define WORD '我的内心是崩溃的'

这词目测在这里要用到太多次。。。。。

Primer Plus的进度到了273页,指针和数组的后半部分。我尝试着去理解书上给我举出的每个例子。很不幸的,今晚状态有够差,一边发呆一边理解我现在晕晕乎乎的。多维数组和多重指针还有指向多个元素的指针对我来说简直就是灾难。首先数组和指针的等级必须对应,即指针指向的元素数量必须和该数组包含的元素数量相等。麻烦就在这里,第几级数组名下包含了几个元素一不小心就能弄错,不是跳到了上一级就是跳到了下一级。摘抄一下书上的笔记:

声明: int  * pt;这是指向一个int的指针

int  (*pa)[3];这是指向3个int组成的数组组成的指针                             

int ar1[2][3];ar1是一个2*3的数组,ar1指向一个3个int组成的数组

int ar2[3][2];ar2是一个3*2的数组,ar2指向一个2个int组成的数组

int **p2;**p2是一个int值,*p2是一个指向一个int值的指针,p2是一个指向一个int值的指针的指针

有结论: pt = &ar1[0][0];都指向一个int

pt = ar1[0];都指向一个int(即&ar1[0][0] = ar1[0]

pt =  ar1;非法赋值

pa = ar1;都指向int[3]

pa = ar2;非法赋值

p2 = &pt;都指向int

*p2 = ar2[0];都指向int

p2 = ar2;非法赋值

恩,WORD,真尼玛乱........由此,想弄清数组和指针的关系首先必须先弄清指针和数组名到第指向哪里,达成这个目标目测需要很多练习,包括书面的和实践的

好吧还有向函数传递一个指针时麻烦也很大,下面是书上的例子:

void somefunction (int (* pt) [4] );这个函数接受一个指向4个int值组成的数组的指针,或者数组名

void somefunction (int pt[][4]);当且仅当pt是函数的形式参量时也可以这样写

我得说我当时第一眼看到这玩意的反应是"void somefunction (int ar[][])"这样的形式是不是也可以,还准备回去就试一下。结果我刚翻了一页就把我这想法枪毙了:

请注意下面的声明是不正确的:int sum2 (int ar[][], int rows);

尼玛你逗我呢?(╯‵□′)╯︵┻━┻

好歹让我自己试试噻?(╯‵□′)╯︵┻━┻

WORD.........................OTL

为什么不可以呢?好吧书上有解释(以下是我的理解):

声明函数时向函数传递的必须是一个准确的数据类型,对一个二维数组,int array[2][3],它的每一级数组名所指向的数据类型大小都是确定的,array指向int[3],array[i]指向int,array[i][j]是一个int值;但在声明函数时如果写成array[][],那么这个数组的大小是不确定的,自然不能确定调用函数时向该函数传递的数据类型,函数在使用该变量是就很可能会出现不知道什么玩意的错误,比如传递一个ar[][3]和ar[][1000]............What the hell?这要怎么想?这个函数接受的数据类型长度到底是3*4还是1000*4?没法知道。说白了,声明函数时你必须告诉编译器这个函数接受的数据类型长度到底是多少,这个要求不仅仅是int型的指针参数,也包括所有的基础和高级数据类型。

说到这里我突然想起来上星期C语言的课教了我们“结构体”这个玩意。

我不管怎么看这东西都是自定义数据类型........................

话说这东西好像有另外一个名字就叫“高级数据类型”........................

尼玛连数据类型都能自定义了?(╯‵□′)╯︵┻━┻

听说C的语法很自由但没箱单这么自由...........OTL

听说C++的语法比C还要自由.......................

我已经看到将来我写C++程序时各种不知道什么玩意的数据类型和函数满天飞的样子了...................................OTL

WORD........................

恩,先学C,然后汇编,然后python(这单词我死都记不住...............),然后java和O-C。

C++是什么?能吃么?(作死)

本来准备怀着作死的心理把那个向函数传递指针的例子抄一下试试的,快半夜了,我还是洗洗睡吧........


你可能感兴趣的:(C语言学习)