欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C Primer Plus--- Chapter 10---Arrays and Pointers ---2. 指针和数组

程序员文章站 2022-03-11 18:32:16
...

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);