1065 数组中的指针
指针:
int *p :一级指针,表示p所指向的地址里面存放的是一个int类型的值 int **p
:二级指针,表示p所指向的地址里面存放的是一个指向int类型的指针(即p指向的地址里面存放的是一个指向int的一级指针)
例如:
inti=10; //定义了一个整型变量
int *p=&i; //定义了一个指针指向这个变量
int **p1=&p; //定义了一个二级指针指向p指针
那么取出10的值方式为:
printf(“i=[%d]\n”,*p);
printf(“i=[%d]\n”,**p1);
二维数组可以理解为一维数组的一维数组 所以a[i]为地址
- 即:
*a = a[0] = a(地址);
*a+i = (a+1) = a[i](第i行首地址);
a[i]+j = a[i][j]地址
(a[i]) = a[i][0]的值,(a[i]+j) = a[i][j]的值
**a = a[0][0] 指针指向(元素)的值,((a+i)+j) = a[i][j](元素的值)
例题:
设有如下数组定义: int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 计算下面各项的值(设数组a的首地址为2000,一个int类型数占四个字节)。
(1)a[2][1] (2)a[1] (3)a (4)a+1
(5)*a+1 (6)*(a+1) (7)a[2]+1 (8)*(a+1)+1
(9)*(*(a+2)+2)
编写一个程序直接输出你的答案,一行一个。
#include <iostream>
#include <string.h>
#include<cstdio>
int main()
{
//数组从0开始
/*二维数组可以理解为一维数组的一维数组 所以a[i]为地址
即:*a = a[0] = a(地址);
*a+i = *(a+1) = a[i](第i行首地址);
*a[i]+j = a[i][j]地址
*(a[i]) = a[i][0]的值,*(a[i]+j) = a[i][j]的值
**a = a[0][0] 指针指向(元素)的值,*(*(a+i)+j) = a[i][j](元素的值)*/
printf("19\n");//a[2][1]
printf("2016\n");//a[1]:第一行首地址
printf("2000\n");//数组首地址
printf("2016\n");//存放指针地址的地址a +1,相当于a[1],即第一行首地址
printf("2004\n");//存放指针地址的指针*a +1,相当于a[0][0]的地址+1,即a[0][1]的地址
printf("2016\n");//a的首地址j+1后的指针指向的值(地址),即a[1][0]的地址
printf("2036\n");//第二行首地址+1,即第二行第一个元素(a[2][1])地址
printf("2020\n");//*(a+1):第1行第0个元素地址 再+1,即a[1][1]的地址
printf("21\n");//a+2:第2行首地址,*(a+2):a[2][0]地址,*(a+2)+2:a[2][2]地址,*(*(a+2)+2):a[2][2]的值
return 0;
}