数组

  • 一维数组

数组定义中类型不能是引用,即没有引用数组,这是因为引用是不能赋值的,而数组中的元素必须可以被赋值。虽然没有引用数组,但数组可以有引用。

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;
//pq虽然都指向数组的一个元素,但由于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指向的是位于文字常量区的字符串,是不允许被修改的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值