设为首页 加入收藏

TOP

数组与指针、变量、字符数组、结构体及其他总结(一)
2019-07-25 14:17:55 】 浏览:229
Tags:指针 变量 字符 结构 及其他 总结

2019-07-18

一:

1.     软件模块划分:高内聚低耦合,提高模块独立性,即使用一个模块完成一项功能,耦合性越少越好。

2.     算法的性质:有穷性(有限操作步骤);确定性(含义唯一,步骤确定);有0个或多个输入;有一个或多个输出;有效性(步骤能有效执行)。

3.     同一文件中的所有函数都能引用全局变量的值。形式参数是局部变量。在函数外定义的变量是全局变量,在函数内定义的变量是局部变量。

二:

1.   程序的局部变量存在于中,全局变量存在于静态区中,动态申请数据存在于中。

  内存中供用户使用的存储空间分为3部分:程序区;静态存储区;动态存储区。

      静态存储区:全局变量(程序开始执行时给全局变量分配存储区,执行完毕后释放,占据固定的存储单元);静态局部变量(只在编译时赋一次初值,只能被本函数引用);静态外部变量(函数外部静态变量);外部变量。栈区。

      动态存储区:函数形式参数(调用函数时给形参分配存储空间);自动变量,即函数中的没有用static声明的变量;函数调用时的现场保护和返回地址等。当函数调用开始时分配动态存储空间,函数结束时释放这些空间。栈区。

      存储类别:自动(auto,默认,动态存储区)、静态(static,静态存储区)、寄存器(registerCPU寄存器中)、外部(extern,静态存储区)。

      内存动态分配区域:随时开辟,随时释放。只能通过指针来引用。堆区。

2.     字符数组s所占空间,sizeof(s)的值。

      char s[]="hello";        => sizeof(s) = 6

3.     结构体n所占空间,sizeof(n)的值。

struct n{

  char c;

  int d;

  short b;

};        => sizeof(struct n) = 12

结构体长度与所占空间不同:

sizeof可计算结构体所占空间。与字节对齐(可自定义字节对齐方式)和结构体中的成员顺序有关。结构体空间分配的默认字节对齐方式为与结构体中所包含类型中最宽的类型对齐。如上例:存储方式:1…42..=>4*3=12字节。

结构体长度直接计算各成员长度即可。

  详细可参考链接:https://blog.csdn.net/qq_28249373/article/details/76784475

4.     形参为一维数组时,形参大小。

数组作函数参数:

a)数组元素作函数实参,向形参变量传递的是数组元素的值;

b)数组名作函数实参,向形参(数组名或指针变量)传递的是数组首元素的地址。

在形参中指定大小是没有意义的,编译时形参数组名被处理为一个指针变量用来接收一个地址,并不检查形参数组大小。

补充:sizeof(long) = 4 sizeof(long long) = 8

ð不管指针的指向类型如何,指针变量占4个字节。

详细参考链接:https://blog.csdn.net/lhj_168/article/details/80308041

指针大小是由当前CPU运行模式的寻址位数决定:Intel 32位处理器32位运行模式,逻辑寻址位数32,指针也就是32位,即4个字节;Intel 32位处理器16位虚拟机运行模式,逻辑寻址位数16,指针也就是16位,即2个字节。

5.   二维数组、一维数组与指针:

(1)二维数组与指针:

     数组名代表数组首元素地址。可将二维数组认为是“数组的数组”,如:int a[3][4]

可将a看作由3个一维数组组成的;

a代表二维数组首元素的地址,但该首元素是由4个整型元素组成的一维数组,即a代表首行的首地址,a+1则为序号为1行的首地址&a[1]

a[0]为一维数组名,数组名代表数组首元素地址,所以a[0]代表一维数组a[0]中第0列的地址&a[0][0],是地址而不是某个元素的值,占存储单元;

a[0]+1&a[0][1](可令a[0]=x,表示一个一维数组名),与a+1相区分,因为a表示的是二维数组首元素即由4个整型元素组成的一维数组的地址,在其基础上+1应加整个元素的长度,即下一行。

*(a+0)a[0]等价(类比一维数组,*(a+i)a[i]是等价的),故:a[0]+1*(a+0)+1都是&a[0][1],进而,*( a[0]+1 )  * ( *(a+0)+1 ) *( * a +1 )a+0=a)都是a[0][1]的值,即*( a[i] + j )*( *( a+i ) +j )都是a[i][j]的值

a+1*( a + 1)是同一个地址,后者不是a+1单元的内容,因a+1是二维数组中第一行的首地址,并不是一个变量的存储单元,无内容可言;*( a + 1 ) a[1],但a[1]是一维数组名,是地址,即指向a[1][0],即表示10列元素a[1][0]的地址

注意,a+1中加的是一维数组的长度,若要得到该一维数组中的某个元素的值,即得到二维数组中的某个元素值,应首先使其加地址的长度变为一个int,而非一维数组的长度4int,也就是要指向某一行的0列而非整行。(a+1)* (a+1)的区别即在于此,前者等价于&a[1] (类比一维数组,令一行=一个元素,&一个元素,即为元素的地址,元素+1,则元素地址+1,对应于一行地址+1),指向行;而后者等价于a[1] ,指向该行中的0列(如前述,可令a[1]=x,表示一个一维数组名,指向x的首元素地址),在后者基础上* ( a + 1 ) + 2则是&a[1][2],进而可得到其值,即:*( *(a+1)+2 )

      a[0]表示包含4个整型元素的一维数组的首元素地址,即一维数组名,指向0行0列,&a[0][0];而a二维数组名,0行首地址,指向一维数组a[0]。指针类型不同,含义不同,加操作的结果也不同。例:排长管3个班,班长管10个战士,一班为一行,

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2019牛客暑期多校训练营(第二场.. 下一篇已知结点地址,如何访问父结构?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目