一维数组的总结及问题

时间:2024-06-01 07:32:28

一维数组的总结及问题

一.总结

二.define和const的区别

三.数组什么时候分配内存?什么时候分配大小?数组最多分配多大内存?

四.&arr和arr的区别

一.总结

1.关于const

①const修饰的变量,不能被改变

被const修饰的东西都受到强制保护

②const定义变量的同时,必须初始化

定义const只读变量,具有不可变性,例如:
const int MAX=100;
int arr[MAX];
在.c文件中,编译器会提示出错,定义一个数组必须指定其元素的个数,这也从侧面证实在c语言中,const修饰的仍然是变量,只不过是只读属性,如果不在声明的时候初始化而在其他地方修改,就违背了“只读”的意思。

2.define 在预编译阶段已经定义

#define命令用于宏定义,按类型可分为不带参数的红定义和带参数的宏定义。

3.栈的布局:由高地址到低地址

堆的布局:由低地址到高地址

数组在栈中的存放:数组元素在栈中a[0]后入栈,他的地址最低

4.数组的两个参数:

①数组名会退化成指针

数组名退化成指针的两种情况:
<1>数组名做函数参数时
<2>二维数组,char s[10][8]数组的首元素是一维数组的s[0],因此退化成&s[0]的指针

②len=sizeof(arr)/sizeof(arr[0]);//len在哪儿定义,在哪儿求

5.数组名不能作为左值

因为数组名是数组的首地址,因为数组一旦定义就会被分配在一片连续的空间,因此数组的地址是不变的,可以说数组名是一个常量指针,一旦定义就不能再被赋值了。

6.数组属于聚合类型,不能整体赋值

7.有关sizeof;

①int arr[100];

sizeof(arr[100])的值为4,因为sizeof只计算长度不进行检查

②int c=34;

sizeof(c++);//c=34;

sizeof(c++)的值为4,因为没有进行运算

③int fun();

sizeof(fun2())=4的值为4,因为函数fun的返回值为int型

8.&arr+1到最后一个元素的后一个元素的第一个

例如:int a[5];
假如a[0]的地址为787878100,则&arr+1的地址为787878120;

9.数组和指针之间访问数组内的元素 &arr+1,arr+1;

如果希望使指针指向数组中的另一个元素,则可使用下标操作符给某个元素定位,然后用取地址操作符&获取该元素的存储地址:
ip=&arr[4];

10.0和‘/0’的区别

①在c语言字符数组里,’\0’和0
是相同的,因为对应的ASCII码相同,都是0,前者表示ASCII是0的字符,后者表示字符0;
②‘\0’是字符数组结束标志,’0‘可以作为字符数组的一个元素,对应的ASCII为48。

11.%s遇到‘/0’停止

12.strlen函数

他是测量字符串长的函数,函数的值为字符串中的实际长度(不包括‘/0’在内),例如:
char str[10]=”China”;
printf(“%d”,strlen(str));//输出结果为5

二.define和const的区别

const和define都可以定义常量,但是前者比后者相比有更多优点:
1.const常量有数据类型,而宏常量没有,编译器可以对前者进行安全检查,而对后者只进行字符替换,并且在字符替换的过程中可能会产生意料不到的错误
2.有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试

三.数组什么时候分配内存?什么时候确定大小?数组最多分配多大内存?

1.数组什么时候分配内存

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。

2.数组什么时候确定大小

当我们定义一个数组时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a。名字一旦与这块内存匹配就不能改变。

3.数组最大分配多大内存

数组大小与栈有关

四.&arr+1和arr+1的区别

一维数组的总结及问题
运行出的地址表明,一个代表的是整个数组的地址,一个代表的是数组首元素的地址,当输出下一个元素时,容易发现&arr下一个元素的地址大于arr下一个元素的地址