2012-07-18-关于指针

来源:互联网 发布:淘宝网一元秒杀在哪里 编辑:程序博客网 时间:2024/05/17 22:58

一、数组指针与数组指针变量

int a[] = {1, 2, 3, 4};

int *p = a;

那么 a 是数组指针,p 是数组指针变量. a 不能变,p 可变.

访问数组元素的三种方法:

1. p = a; *p; ++p;

2. i=0; *(p+i); ++i;

3. p[i++];

引用一维数组元素的四种方法:a[i], p[i], *(a+i), *(p+i).

二、二维数组与指针

掌握以下三个概念:二维数组行首地址、行地址、元素地址.

若 int a[][2] = {11, 12, 21, 22, 31, 32};

则:

1. 行首地址:a[i], &a[i][0]

2. 行地址:a+i, &a[i]

3. 元素地址:a[i] + j, *(a+i) + j, &a[i][0] + j, &a[i][j].

其中,a[i] = &a[i][0] = a + i = &a[i]. 但行地址和行首地址不是同一种类型,要将行地址赋值给数组指针变量需要强制类型转换:

int * p = a + 1; // error

int * p = (int *) (a + 1); // ok.

三、综合实例:两种方式打印行地址,三种方式打印行首地址,四种方式打印元素。

////  pointer-and-address.cpp//  2012-07-18-cpp-test////  Created by bh10 on 12-7-18.//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.//#include <iostream>using namespace std;#define ps(x) cout << #x " = " << x << endl#define pInfo(x) cout << "-------------------" << x << "----------------------" << endl#define p(x) cout << x#define cr cout << endlint main() {  int a[][3] = {11, 12, 13, 21, 22, 23};  int dim1Len = sizeof a / sizeof(a[0]);  int dim2Len = sizeof a[0] / sizeof(a[0][0]);    // two ways to get row address.  pInfo("row address!");  for (int i=0; i<dim1Len; ++i) {    ps(a + i);    ps(&a[i]);  }  pInfo("end");    //three ways to print head addresses of each row.  pInfo("row head addresses!");  for (int i=0; i<dim1Len; ++i) {    ps(&a[i][0]);    ps(a[i]);    ps(*(a + i));  }  pInfo("end");    // four ways to print each elems.  pInfo("elems");  for (int i=0; i<dim1Len; ++i) {    for (int j=0; j<dim2Len; ++j) {      ps(*(a[i] + j));      ps(*(*(a+i) + j));      ps(*(&a[i][0] + j));      ps(a[i][j]);    }  }  pInfo("end");    return 0;}


原创粉丝点击