- 一维数组
数组定义中类型不能是引用,即没有引用数组,这是因为引用是不能赋值的,而数组中的元素必须可以被赋值。虽然没有引用数组,但数组可以有引用。
int a[6] = {0,2,4,6,8,10};
int (&p)[6] = a;//数组a的引用
如上,数组的引用可以用于函数传递参数,确保传递过来的数组长度合乎要求。
初始化
内置类型的全局数组,元素初始化为0;
函数体内定义的内置类型数组,元素无初始化(若只初始化部分元素,其后的元素此时也会被初始化为0);
非内置类型数组,不管其在哪定义,自动调用其默认构造函数为其初始化,若该类无默认构造函数会报错。C风格的字符串包括两种:字符串常量和末尾添加了\0的字符数组
'\101' //代表字符A,/ddd格式表示八进制
- c/c++中的字符串处理函数(strcpy,strcat等),传递给这些标准库函数的指针必须有非零值,并且指向以null结束的字符数组中的第一个元素。
char c[] = {'a','b','c'};
cout << strlen(ca) << endl;
上述strlen的计算结果不确定
int a[3][2] = {(0,1),(2,3),(4,5)};
//等价于 int a[3][2] = {1,3,5},此处考察逗号运算符
a[x][y] = b[x*列数+y];
p[i] = *(p+i);
//二维数组的动态声明
int **a = new int * [m];
for(int i=0; i<m; i++)
a[i] = new int [n];
//动态声明的数组任意的a[k]都是一个int*类型,即一个地址,所以只能a[i][j]或者*(*(a+i)+j)来访问数组的元素,不能a[i*n+j]这样使用
//p指向i,且不能通过p修改i的值
// output garbage value
void main()
{
int i = 11;
int const *p = &i;
p++;
printf("%d", *p);
}
//指向有10个元素整型数组的指针
int (*p)[10];
int a[10];
int (*p)[10] = &a;
int *q = a;
指针的合法运算:
指针与整数的加减(包括指针的自增自减)
同类型指针间的比较
同类型的两指针相减
int a[4][10];
int (*p)[10];
p = a; //a的类型是int(*)[10]
int a[10];
int (*p)[10] = &a;
int *q = a;
//p与q虽然都指向数组的一个元素,但由于p的类型与q的类型不同,p是指向有10个元素整型数组的指针,*p的大小是40个字节,而q是指向整型的指针,*q的大小是4个字节。
void test2()
{
int a[10] = { 1 };
int(*p)[10] = &a;
printf("%p\n", a);
printf("%p\n", p);
printf("%p\n", p + 1);
printf("%p\n", a + 1);
}
char a[] = "hello";
char *q = "hello";
//a是数组,内存分配在栈上,故可以通过数组名或指向数组的指针进行修改,而p指向的是位于文字常量区的字符串,是不允许被修改的。