数组的数组名其实可以看作一个指针。看下例:

1.    int array[10]={0,1,2,3,4,5,6,7,8,9},value;

2.    value=array[0]; //也可写成:value=*array; 

3.    value=array[3]; //也可写成:value=*(array+3); 

4.    value=array[4]; //也可写成:value=*(array+4);

上例中,一般而言数组名array 代表数组本身,类型是int[10],但如果把array 看做指针的话,它指向数组的第0 个单元,类型是int* 所指向的类型是数组单元的类型即int。因此*array 等于0 就一点也不奇怪了。同理,array+3 是一个指向数组第3 个单元的指针,所以*(array+3)等于3。其它依此类推。

1.    char *str[3]={

2.        "Hello,thisisasample!",

3.        "Hi,goodmorning.",

4.        "Helloworld"

5.    };

6.    char s[80];

7.    strcpy(s,str[0]); //也可写成strcpy(s,*str); 

8.    strcpy(s,str[1]); //也可写成strcpy(s,*(str+1)); 

9.    strcpy(s,str[2]); //也可写成strcpy(s,*(str+2));

上例中,str 是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str 当作一个指针的话,它指向数组的第0 号单元,它的类型是char **,它指向的类型是char *。
*str 也是一个指针,它的类型是char *,它所指向的类型是char,它指向的地址是字符串"Hello,thisisasample!"的第一个字符的地址,即'H'的地址。注意:字符串相当于是一个数组,在内存中以数组的形式储存,只不过字符串是一个数组常量,内容不可改变,且只能是右值.如果看成指针的话,他即是常量指针,也是指针常量.
str+1 也是一个指针,它指向数组的第1 号单元,它的类型是char**,它指向的类型是char*。
*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,goodmorning."的第一个字符'H'

下面总结一下数组的数组名(数组中储存的也是数组)的问题:声明了一个数组TYPE array[n],则数组名称array 就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0 号单元,该指针自己占有单独的内存区,注意它和数组第0 号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。在不同的表达式中数组名array 可以扮演不同的角色。在表达式sizeof(array)中,数组名array 代表数组本身,故这时sizeof 函数测出的是整个数组的大小。在表达式*array 中,array 扮演的是指针,因此这个表达式的结果就是数组第0 号单元的值。sizeof(*array)测出的是数组单元的大小。表达式array+n(其中n=0,1,2,.....)中,array 扮演的是指针,故array+n 的结果是一个指针,它的类型是TYPE *,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。在32 位程序中结果是

1.    int array[10];

2.    int (*ptr)[10];

3.    ptr=&array;

上例中ptr 是一个指针,它的类型是int(*)[10],他指向的类型是int[10] ,我们用整个数组的首地址来初始化它。在语句ptr=&array中,array 代表数组本身。本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:
int(*ptr)[10];则在32 位程序中,有:
sizeof(int(*)[10])==4
sizeof(int[10])==40
sizeof(ptr)==4实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。

c语言memset清空指向数组的指针_C语言中数组和指针的关系相关推荐

  1. C#中的数组和C++中数组的区别

    c#中的数组和c++中数组的区别 c#中数组是引用类型,c#定义整型数组方式是:int [] intarray = {1,2,3};或int [] intarray = new int[10];而c+ ...

  2. c++如何打印一维数组首地址_C语言之二维数组和指针的结合

    最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...

  3. *(p+i) ,C语言数组指针_C语言中文网

    一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址. 字节是内存中的最小可操作单位,我们 ...

  4. 出参传递数组指针_C语言指针重难点详解

    1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 ...

  5. c语言指针查找数组一个数_C语言快速入门——指针与数组

    与数组有关的地址 我本来打算以一个程序开始,让我们直接理解相关概念.但转念一想,如果引导你思考问题而得出结论,或许会有另一种效果,因此,我们的讨论以下面的定义为基础. int a = 9;int b[ ...

  6. android 数组赋值字符串_c语言中的字符数组与字符串

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...

  7. 数组做参数_C语言进阶之路:函数—数组参数!

    数组参数属于指针参数. 指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径. 如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针. 1. 数组参 ...

  8. c语言 指针_C 语言指针详解

    (给CPP开发者加星标,提升C/C++技能) 作者:C语言与CPP编程 / 自成一派123(本文来自作者投稿) 1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直 ...

  9. c语言 指针_C语言野指针以及非法内存操作

    如果一个指针指向的内存没有访问权限,或者指向一块已经释放掉的内存,那么就无法对该指针进行操作,这样的指针称为野指针(Wild Pointer). 指向没有访问权限的内存 请看下面的代码: #inclu ...

最新文章

  1. Windows进程与线程学习笔记(一)—— 进程结构体
  2. qemu debug linux内核,qemu调试linux内核
  3. 为什么标准C++中两个直接字符串常量不能相加
  4. 在Android中使用FlatBuffers
  5. 奇淫巧技-Flutter调用C#
  6. webpack 引入jquery和第三方jquery插件
  7. 5kb大小的云洗衣机HTML源码 朋友圈在线洗衣服
  8. iOS开发日记9-终端命令
  9. 项目中坑记录:mongo 插入失败无提示
  10. 用python简单处理图片(5):图像直方图
  11. W25Q16 存储器(Flash)
  12. PHP获取当前域名的记录
  13. 计算机考试如何截屏,教你6种电脑截屏的小技巧-电脑怎么截图
  14. Spring的事务控制
  15. IntelliJ IDEA 2016.2 注册破解激活教程
  16. [转]爬虫的现状和反爬虫
  17. 网站如何做seo优化
  18. Python异常UnicodeEncodeError: 'gbk' codec can't encode character '\uXXX' in position
  19. Java+Appium+Junit demo
  20. list of questions

热门文章

  1. 据说一般人轻易做不了技术支撑…
  2. 将HTML字符转换为DOM节点并动态添加到文档中
  3. Kotlin 知识梳理(13) 运行时的泛型
  4. Nginx 教程- 获取真实IP模块 - http_realip_module
  5. 关于Flex-Mvc的几个框架的简单介绍
  6. 这公司需要再利用CPU热能:于是淘汰i7换AMD Ryzen
  7. 受软银收购利好影响 ARM股价大涨近50%
  8. 作业调度框架_Quartz
  9. 在大规模系统中使用Scala
  10. Linux终端管理软件