1. 数组,输入一个不大于五位数的整数,每位数字,分别存储在数组里:
拆分为每位数字:value % 10; value /= 10;
为保证输入的是三位(或更小)数,导致数组输出时出现 0 ,所以给数组初始化为 -1。
2. arr 是数组名称,指的是首个数组地址;
arr, arr[0] 地址一样;
arr = 1; 错误,数组名称地址不可以被赋值,数组名称显示为地址;
3. 数组地址变量作加减运算,不是简单的数值上的加减运算: &arr + 1 和 arr + 1 地址值不一样。
&arr + 1, 此处 1 是整个数组地址大小;
arr + 1, 此处 1 是变量地址大小。 arr + 1 和 arr[1] 地址一样;
记住: *(arr + 1) = arr[1];
printf("%d ", arr[i]); 等价于 printf("%d ", *(arr + i));
举例:
int data[3][4];
data 代表数组的首地址,也就是数组中第一个元素的地址,data 也就是第一行的首地址,
与第一行中第一个元素的地址相同,但是级别不一样;
下面这段代码都从地址角度分析:
&data; // 和 data 的值一样
data + 1; // 加一行,相当于指向第二行首地址
&data + 1; // 增加整个数组长度
data[0] + 1; // 增加一个元素地址,data[0][1]的地址
*(data + 1); // 增加一行地址,拿到第二行中第一个元素地址data[1][0]
*(data + 1) + 1; // 后一个 1 是增加一个元素地址,data[1][1]
&data[0] + 1; // 增加一整行地址,data[1][0]
总结:对数组名取 &,提高其级别;取 * 降低其级别;
int arr[5];
int *p = &arr[2];
int k = p[-2]; // ok, k = arr[0];
问:简述数组与指针的区别 ?
答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建;指针可以随时指向任意类型的内存块。
1)修改内容上的差别
char a[] = "hello";
a[0] = 'X';
char *p = "word"; // 注意 p 指向常量字符串
p[0] = 'X'; // 编译器不能发现该错误,运行时错误
2) 用运算符 sizeof 可以计算出数组的容量(字节数);
sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是 p 所指的内存容量。
C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
计算数组和指针的内存容量
void Func(char a[100]) {
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}
4. 对数组名称用 sizeof(arr),得出来的是整个数组的地址大小;
sizeof(arr) / sizeof(arr[0]) 得出数组个数;
5. 数组初始化问题:
int arr[]; // 编译错误
int arr[5]; // 编译可以通过,数组元素为随机数
int arr[5] = {1, 5, 3}; // 其他数据初始化为 0;
int arr[5] = {0}; // 把每个元素初始化为 0;
int arr[5] = {[0] = 1, [1] = 5, [2] = 3};
int arr[5] = {}; // 不推荐,会产生随机数;
int arr[] = {1, 5, 3, 4}; // 不推荐;
拆分为每位数字:value % 10; value /= 10;
为保证输入的是三位(或更小)数,导致数组输出时出现 0 ,所以给数组初始化为 -1。
2. arr 是数组名称,指的是首个数组地址;
arr, arr[0] 地址一样;
arr = 1; 错误,数组名称地址不可以被赋值,数组名称显示为地址;
3. 数组地址变量作加减运算,不是简单的数值上的加减运算: &arr + 1 和 arr + 1 地址值不一样。
&arr + 1, 此处 1 是整个数组地址大小;
arr + 1, 此处 1 是变量地址大小。 arr + 1 和 arr[1] 地址一样;
记住: *(arr + 1) = arr[1];
printf("%d ", arr[i]); 等价于 printf("%d ", *(arr + i));
举例:
int data[3][4];
data 代表数组的首地址,也就是数组中第一个元素的地址,data 也就是第一行的首地址,
与第一行中第一个元素的地址相同,但是级别不一样;
下面这段代码都从地址角度分析:
&data; // 和 data 的值一样
data + 1; // 加一行,相当于指向第二行首地址
&data + 1; // 增加整个数组长度
data[0] + 1; // 增加一个元素地址,data[0][1]的地址
*(data + 1); // 增加一行地址,拿到第二行中第一个元素地址data[1][0]
*(data + 1) + 1; // 后一个 1 是增加一个元素地址,data[1][1]
&data[0] + 1; // 增加一整行地址,data[1][0]
总结:对数组名取 &,提高其级别;取 * 降低其级别;
int arr[5];
int *p = &arr[2];
int k = p[-2]; // ok, k = arr[0];
问:简述数组与指针的区别 ?
答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建;指针可以随时指向任意类型的内存块。
1)修改内容上的差别
char a[] = "hello";
a[0] = 'X';
char *p = "word"; // 注意 p 指向常量字符串
p[0] = 'X'; // 编译器不能发现该错误,运行时错误
2) 用运算符 sizeof 可以计算出数组的容量(字节数);
sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是 p 所指的内存容量。
C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
计算数组和指针的内存容量
void Func(char a[100]) {
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}
4. 对数组名称用 sizeof(arr),得出来的是整个数组的地址大小;
sizeof(arr) / sizeof(arr[0]) 得出数组个数;
5. 数组初始化问题:
int arr[]; // 编译错误
int arr[5]; // 编译可以通过,数组元素为随机数
int arr[5] = {1, 5, 3}; // 其他数据初始化为 0;
int arr[5] = {0}; // 把每个元素初始化为 0;
int arr[5] = {[0] = 1, [1] = 5, [2] = 3};
int arr[5] = {}; // 不推荐,会产生随机数;
int arr[] = {1, 5, 3, 4}; // 不推荐;