C语言中,用来标识函数名、变量名、符号常量名、文件名、数组名、类型名的有效字符序列称为( )。
答案是:标识符
用来标识变量名、符号常量名、函数名、类型名和文件名等的有效字符序列称为标识符
C语言中数组名在表达式中被解读为指向数组首元素的指针, 即数组名在表达式中值为数组首元素的地址。(但有个例外,int a[2];int (*pa)[2]; pa=&a;
数组名前加&
,取得“指向数组的指针”,这时a
不解读为指向数组首元素的地址)。根据ANSI C的定义,在数组前加上&,可以取得“指向数组的指针”。
例如,int a[2];
在表达式中a
表示数组首元素地址;
再例如,int a[3][2];
在表达式中a
仍然表示数组首元素的地址,不过此时数组a
的基本元素是int[2]
,因此a+1
每次会增加基本元素int[2]
的大小。
C语言中不存在多维数组,只存在数组的数组,所谓的多维数组是便于理解提出的一种说法而已。
C语言中数组类型是包含元素个数的。
示例1:
#include <stdio.h>
int main()
{
int a[3][2] = { 0 };
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 2; ++j)
{
printf("a[%d][%d]: %p\t",i,j,&a[i][j]);
}
printf("\n");
}
printf("\n");
printf("&a + 1: %p\n", &a + 1); // 实际相对于a[0][0]地址增加了3*2*sizeof(int)=24
printf("a + 1: %p\n", a + 1); // 实际相对于a[0][0]地址增加了2*sizeof(int)=8
printf("\n--------------------------------------------\n\n");
int b[3] = { 0 };
printf("&b[0]: %p\n", &b[0]); // 数组b首元素地址
printf("&b + 1: %p\n", &b + 1); // 实际相对于b[0]地址增加了3*sizeof(int)=12
printf("b + 1: %p\n", b + 1); // 实际相对于b[0]地址增加了sizeof(int)=4
return 0;
}
输出的结果可能是:
示例2:
#include <stdio.h>
int main() {
int arr[5] = { 1,2,3,4,5 };
int(*parr)[5];
parr = &arr; // parr只有一个元素,即arr
for (int i = 0; i != 5; ++i)
{
// (*(parr+0))[i] += 1;
// (*parr)[i] += 1;
parr[0][i] += 1; // 很容易错写成parr[i] += 1;
}
for (int i = 0; i != 5; ++i)
{
// printf("%d\n", (*parr)[i]);
printf("%d\n", parr[0][i]); // 输出结果为2 3 4 5 6
}
}