数组指针和指针数组简单了解

这两个看起来很相似,但是却完全不一样。下面先说下数组指针。

数组指针,例如int(*p)[5],定义了一个数组指针,它指向指向包含5个int型元素的一维数组。来个程序看看。

1 #include<stdio.h>
2 int main()
3 {
4     int c[4]={1,2,3,4};            //定义一个整型数组
5     int (*b)[4];                //定义一个指向为int()[5]类型的数组指针
6     b=&c;                        //将c数组的地址赋给b
7     printf("%d",*(*b+1));        //*b+1为c数组第二个元素的地址
8     return 0;
9 }

上面这个程序的会输出c数组第二个元素的值,也就是2。其中第6行,将数组c的地址赋给指针b,虽然&c、c和&c[0]的值都相等,都表示数组的首地址,但是三者意义不同,c和&c[0]都表示数组第一个元素的地址,+1跨过1个数组元素;而&c表示整个数组的地址,+1跨过一个数组,即指向c[5],(虽然不存在)。

可以看下这个程序

 1 int main()
 2 {
 3     int a[4]={1,2,3,4};
 4     int *p=(int *)(&a+1);        //定义一个整型指针指向(&a+1)
 5     p=p-1;                       //让p减1即减去一个int型的大小
 6     printf("%d",*p);             //输出p指向的值为a[3];可见&a+1的即为a[4]的地址
 7     printf("%d",*(&a[0]+1));     //输出为a[1]的值
 8     printf("%d",*(a+1));         //输出为a[1]的值
 9     return 0;
10 }

现在再来看一个程序

 1 int main()
 2 {
 3     int i,j;
 4     int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
 5     int(*p)[4];
 6     p=a;                //把a当做一个一维数组,其中每个元素又是一个含4个元素的数组
 7     for(i=0;i<3;i++)
 8         for( j=0;j<4;j++)
 9             printf("%d",*(*(p+i)+j));
10             /*其中*p+j表示二维数组a[0][j]的地址,*(p+i)+j表示a[i][j]的地址*/
11     return 0;
12 }

这里直接把二维数组当做一维数组来处理。

讲了半天,估计还是有点乱,现在总结下,数组指针,就是指针,只不过指向的为数组,可以通过它来访问数组,前提是数组的类型要和指针指向的类型相同。

现在在来看看指针数组,总结上面的经验,看下这个的名字,应该能猜到它是一个数组,对的,它也是一个很普通的数组,只不过里面全存的是指针而已。

来看下这个,int *a[3],表示a是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。

可以用一个指针数组来指向一个二维数组

 1 int main()
 2 {
 3     int i,j;
 4     int    a[2][3]={1,2,3,4,5,6};
 5     int *b[2]={a[0],a[1]};                //定义一个指针数组,里边的元素为a数组第一维和第二维的地址。
 6     for(i=0;i<2;i++)
 7         for(j=0;j<3;j++)
 8             printf("%d",*(*(b+i)+j));
 9             /*其中(b+i)表示b[i]的地址,*(b+i)表示a[i]的地址,(a[i]+j)表示i行j列元素地址*/
10     printf("\n%p %p\n",b[0],a[0]);
11     return 0;
12 }

输出结果为

1 123456
2 0xbfa12e34 0xbfa12e34

可见b数组中存的为a数组一维地址。

指针数组还可以用于字符串的储存

 1 int main()
 2 {
 3     int i;
 4     char *str[]={"你","我","他"};    //数组中存的为字符串常量的地址
 5     for(i=0;i<3;i++)
 6         printf("%s",str[i]);
 7     printf("%p",str[0]);            //通过这行和下行比较两个地址是否相同
 8     printf("%p","你");
 9     return 0;
10 }

这部分的内容还是比较难的,一定要多看,多理解,加油!!!

时间: 2024-11-05 23:36:22

数组指针和指针数组简单了解的相关文章

指针数组、数组指针、指针函数、函数指针的简单介绍

一.指针数组:本质是一个数组,里面存放的元素是指针.例如:char *nums[10];定义了一个名称为num 长度为10的存放元素为:指向char类型数据的指针变量的数组.数组中的每个元素都是一个指针,每个指针都可以指向一个字符串. 在程序中举例: int main(int argc, const char * argv[]) { // 指针数组就是用来表示字符串的数组 char *strs[10]; // 声明了一个数组, 允许存储 10 个字符串 // 每一个字符串 strs[0] = "

(C/C++)区别:数组与指针,指针与引用

1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

【C语言】12-指向一维数组元素的指针

一.用指针指向一维数组的元素 1 // 定义一个int类型的数组 2 int a[2]; 3 4 // 定义一个int类型的指针 5 int *p; 6 7 // 让指针指向数组的第0个元素 8 p = &a[0]; 9 10 // 修改所指向元素的值 11 *p = 10; 12 13 // 打印第一个元素的值 14 printf("a[0] = %d", a[0]); 输出结果:,说明已经通过指针间接修改了数组元素的值,跟指向一个普通int类型变量是一样的. 由于数组名代表

不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, const 对象的引用 作者:webabcd 介绍不可或缺 Windows Native 之 C++ this 指针 对象数组 对象和指针 const 对象 const 指针和指向 const 对象的指针 const 对象的引用 示例1.CppEmployee 类CppEmployee.h #pragma

指针数组、数组指针、函数指针、指针函数总结

指针数组 && 数组指针 char *a[5]; //定义一个指针数组, 数组的元素都是char *指针类型.初始化也可以在里面存放字符或字符串.a的类型是char *[5] //若char *a[5]={"red","white","blue","dark","green"}; //a在这里的类型是char *[],实质上是一个二级指针.也就是说a所代表的那块内存里面存放着的是数组中第一个

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p

转:字符数组与字符指针

转自:http://blog.csdn.net/qiumm/article/details/5657120 1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a st

指针的指针&amp;指向指针数组的指针

一.指针的指针    指针的指针看上去有些令人费解.它们的声明有两个星号.例如:        char ** cp;    如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推.当你熟悉了简单的例子以后,就可以应付复杂的情况了.当然,实际程序中,一般也只用到  二级指针,三个星号不常见,更别说四个星号了.    指针的指针需要用到指针的地址.        char c='A';        char *p=&c;        char **cp=&p