一维数组的总结及问题
一.总结
二.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下一个元素的地址