版权声明:共享知识,欢迎转载 https://blog.csdn.net/kakiebu/article/details/82770454
1. 数组
int a[10] = {1,2,3,4,5,6,7,8,9,0};
注意,数组名是存放第一个元素的地址。
int mian(){
int a[5] = {1,2,3,4,5};
printf(“a=%p\n”, a);
for(int i=0; i<5; i++){
printf(“&a[%d] = %p\n”, i, &a[i]);}
*a += 100;
printf(“%d %p %p \n”, a[0], &a, &a[0]);
for(int i=0; i<5; i++){
printf(“%d %d %p %p \n”, a[i], *(a+i), &a[i], (a+i));}
return 0;
}
这里没写数据越界的例子,数据越界会影响其他数据的值,甚至是程序崩溃
2. 字符串
字符串在存储时,每个字符串结束后都会有\0
如果按照%s 输出%c 可能会输出乱码
可以 char a[] = {‘a’, ‘b’, ‘\0’};
3. 数组的长度
int a[5][10] 有一个int型的数组,长度是5,其中每个元组又是一个int [10]的数组
int a[3][5] = {{1,2}, {3}, {4,5}}; a[0]与a[1]之间的地址相差4*5=20字节
因此 int a[3];如果a[0]的地址是0x0,那么a[1]的地址就是0x4,因为int占4个字节
4. 数组的地址
对比以下两种写法:
int main(){
char a[100] = {"qwertyuioplkjhgfdsazxcvbnm"};
char *b = &a[5];
printf("%s\n", b);
return 0;
}
#include<stdio.h>
int main(){
char a[8] = {'q','w','e','r','t','y','u','m'};
char *b = &a[5];
printf("%c\n", a[5]);
printf("%s\n", b);
printf("%s\n", a);
printf("%s\n", a)[0];
printf("%s\n", &a[0]);
return 0;
}
1. 数组的两种写法,第一个和第二个,输出结果都是从第五个元素一直输出到末尾。
2. 为什么数组、地址分不开?因为数组就是一个连续的内存地址,并返回首地址,因此char a[8] 和 char *b没有什么本质区别,都是一个数组,只是一个长度固定,一个长度不固定。
3. char *b = &a[5]; 这句话是说对a数组偏移5个位置,并返回他的地址给b,作为b数组的首地址。因此在输出时寻址输出。
5. 数组的初始化
数组的初始化有两种:先声明后初始化和声明同时初始化。
这里需要注意的是,声明后默认值为\0,正好是字符串的结束标识符,因此
char a[9] = {‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’ };这样写肯定不会有乱码
puts(a);
char a[8] = {‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’ };这样写肯定会有乱码
puts(a);