C Primer Plus--- Chapter 10---Arrays and Pointers ---2. 指针和数组
程序员文章站
2022-03-11 18:32:16
...
C Primer Plus--- Chapter 10---Arrays and Pointers ---2. 指针和数组
1. 指针
定义:
指针是一个变量,用于存放内存地址。
int pooh;
int *pt; //定义变量pt 为指针,且指针指向的是 int 类型的数据
pt = &pooh; //指针变量 pt 的值为变量 pooh 的地址,因此 pt 指向 pooh
*pt = 3; // * 表示取指针指向的变量的值,这里即给 pooh 赋值为3
注意:不能使用一个未初始化的指针
int * pt; // an uninitialized pointer
*pt = 5; // a terrible error
2. 指针和数组
数组的名字是第一个元素的地址。
int a[9];
a == &a[0];//两者都是常量
int *p;
p = a;
p+2 == &a[2];
*(p+2) == a[2];
3. 函数,指针和数组
在函数形参的声明中,可以用 int a[] 的形式表明 a 是指向 int 的指针。
但这种形式仅能在形参中使用。
它与直接写 int *a 区别是,这种形式能更好表明 a 不仅是指针,也指向数组的一个元素。
在函数声明中,一下三种形式等价:
int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar[], int n);
int sum(int [], int);
但是在函数定义时,不能省略名字,一下两种等价:
int sum(int *ar, int n)
{
// code goes here
}
int sum(int ar[], int n);
{
// code goes here
}
4. 指针和数组区别
函数的形参可以进行传值调用(不改变原数据),或通过指针改变原始数据。
如果调用函数时不希望改变原始数据,可以在形参前加上 const 关键字。
5. 指针和多维数组
pz 是一个指针,它指向一个包含两个元素的数组
int (* pz)[2]; // pz points to an array of 2 ints
pax 是一个数组,其元素是两个指针,指针指向int型变量。
int * pax[2]; // pax is an array of two pointers-to-int
指针兼容性:两种不同类型的指针不能相互转换
int n = 5;
double x;
int * p1 = &n;
double * pd = &x;
x = n; // implicit type conversion
pd = p1; // compile-time error
6. 函数和多维数组
有一下函数声明:
void somefunction( int (* pt)[4] );
该函数的形参 pt 表示是一个指针,指向包含4个int型的数组。
上述形式还可以如下声明:
void somefunction( int pt[][4] );
第一个空括号 [] 表明 pt 是一个指针。这种形式第一个空号也可以写参数,但会被忽略:
两种声明相同, ar 是一个指针,指向一个包含4个元素的数组。
int sum2(int ar[][4], int rows); // valid declaration
int sum2(int ar[3][4], int rows); // valid declaration, 3 ignored
7. 可变长度数组
可变长度数组,即 Variable-Length Arrays (VLAs),并非值数组的长度在创建后能修改,而是指在创建数组时能用变量来声明长度。
int sum2d(int rows, int cols, int ar[rows][cols]); // ar a VLA
这里 ar 其实是一个指针,因此在调用该函数时,实际作用是原始数据。
8. 复合文字(Compound Literals)
符合文字只是用于临时需要使用,
(int []){50, 20, 90} // a compound literal with 3 elements
int * pt1;
pt1 = (int [2]) {10, 20};
pt1[0] == 10;
pt1[1] == 20;
int sum(const int ar[], int n);
...
int total3;
total3 = sum((int []){4,4,4,5,5,5}, 6);
下一篇: css背景图片怎么自适应