第五章 数组和指针的关系

如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文章<<如何
理解c和c++的复杂类型声明>>。
    数组的数组名其实可以看作一个指针。看下例:
例八:
         int array[10]={0,1,2,3,4,5,6,7,8,9},value;
           ...
           ...
         value=array[0];//也可写成:value=*array;
         value=array[3];//也可写成:value=*(array+3);
         value=array[4];//也可写成:value=*(array+4);
    上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把a
rray看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数
组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个
指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

例九:
         char *str[3]={
                        "Hello,this is a sample!",
                        "Hi,good morning.",
                        "Hello world"
                      };
         char s[80];
         strcpy(s,str[0]);//也可写成strcpy(s,*str);
         strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
         strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));
    上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指
针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号
单元,它的类型是char**,它指向的类型是char *。
    *str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地
址是字符串"Hello,this is a sample!"的第一个字符的地址,即'H'的地址。
    str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向
的类型是char *。
    *(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向
"Hi,good morning."的第一个字符'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扮演的是指针,故arr
ay+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第
n号单元。故sizeof(array+n)测出的是指针类型的大小。
例十:
         int array[10];
         int (*ptr)[10];
         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(对象)测出的都是对象自身的类型的大小,而不是别的什么
类型的大小。

转载于:https://www.cnblogs.com/jhjh/archive/2011/06/12/2079219.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第5章 JVM调优

2019独角兽企业重金招聘Python工程师标准>>> ##5.1 Java虚拟机内存模型## Java虚拟机内存模型是Java程序运行的基础。JVM将其内存数据分为程序计数器&#xff0c;虚拟机栈&#xff0c;本地方法栈&#xff0c;Java堆和方法区等部分。 程序计数器&#xff1a;用于存放…

C语言讲义——字符串

字符数组 C语言字符串就是字符数组。 单写字符&#xff0c;用单引号。如&#xff1a;’A’。字符串用双引号。如&#xff1a;”A”、”ABC”。#include <stdio.h> main() {char c1 a;printf("%c\n", c1-1);printf("%c\n", c1);printf("%c\n&qu…

怎样在PHP中通过ADO调用Asscess数据库和COM程序

PHP4已经支持Microsoft的COM技术。然而文档中在COM部分却提得很少。 这儿是几个我试过的例子。希望这些给你一些概念。注意的是这些只能运行在32位的Microsoft Windows平台下。 用php激活ADO ADO是Microsoft的数据库对象技术。ADO里面包括连接数据库的对象&#xff0c;从查询…

LeetCode—264. 丑数 II

264. 丑数 II 题目描述&#xff1a; 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。 丑数 就是只包含质因数 2、3 和1或 5 的正整数。 考察重点&#xff1a;动态规划。可以写出转移方程&#xff1a;res[i]min(res[p1]2,res[p2]3,res[p3]5)&#xff0c;其中res表…

grep与正则表达式

http://my.unix-center.net/~Simon_fu/?p469 虽然正则表达式经常都在用&#xff0c;但是很少能够静下心来仔细的总结一下。最近看了一个台湾人的网站叫做鸟哥Linux私房菜&#xff0c;关于正则表达式的描述挺详细的。在此&#xff0c;我进行一下总结&#xff0c;如果想仔细的学…

c基础--II

c基础&#xff0d;&#xff0d;II 数据输出putchar()函数#include "stdio.h"main(){ char a,b,c; aa; bb; cc; //putchar()函数 putchar(a); putchar(b); putchar(c);}printf()函数printf(格式控制&#xff0c;输出列表)%d 输出 十进制整数%o 输出 八进…

Chuck Cobb谈敏捷组织中PMO的角色

对于设立了PMO&#xff08;项目管理办公室&#xff09;的企业&#xff0c;实施整个企业向敏捷风格的转换可能需要多个部门同步改变工作方式。在敏捷的团队中&#xff0c;PMO的传统角色需要做出改变。Charles G. “Chuck” Cobb,专家级敏捷项目经理、顾问、图书作者,最近分享了对…

为使用mysql而配置codeblocks工程

心结&#xff1a; 为了在codeblocks下创建的C工程中使用mysql&#xff0c;辛辛苦苦忙活了半个下午&#xff0c;终于长舒一口气&#xff0c;搞定了&#xff0c;编译成功。其中不乏数次的成功于失败的反复。个中滋味&#xff0c;只有让我有擂头顿足的冲动。不过&#xff0c;还算…

Java初学者入门经典:面向对象的思维方法(其实同样非常适合C#的初学者)……非原创,作者忘了,非常抱歉...

我是从学习Java编程开始接触OOP(面向对象编程)&#xff0c;刚开始使用Java编写程序的时候感觉很别扭&#xff0c;因为我早以习惯用C来编写程序&#xff0c;很欣赏C的简洁性和高效性&#xff0c;喜欢C简练而表达能力丰富的风格&#xff0c;特别忍受不了Java运行起来慢吞吞的速度…

极客

2019独角兽企业重金招聘Python工程师标准>>> 极客是美国俚语“geek”的音译。随着互联网文化的兴起&#xff0c;这个词含有智力超群和努力的语意&#xff0c;又被用于形容对计算机和网络技术有狂热兴趣并投入大量时间钻研的人。现代的Geek含义虽然与过去有所不同&am…

大数据——SparkStreaming学习笔记

Spark 一、SparkStreaming ​ Spark Streaming 用于流式数据的处理&#xff08;准实时&#xff0c;微序列&#xff09;。Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、 Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。数据输入后可以用 Spark…

[推荐]ORACLE SQL:经典查询练手第三篇(不懂装懂,永世饭桶!)

[推荐]ORACLE SQL&#xff1a;经典查询练手第三篇(不懂装懂&#xff0c;永世饭桶&#xff01;) [推荐]ORACLE SQL&#xff1a; 经典查询练手第三篇(不懂装懂&#xff0c;永世饭桶&#xff01;) ——通过知识共享树立个人品牌。 本文与大家共同讨论与分享ORACLE SQL的一些常用经…

ACM试题 - ASCII码排序 - Java中字符与对应ASCII码的转换

Java中字符转换对应ASCII码有两种方式&#xff1a; 第一种&#xff1a; char c a; byte b (byte)c; // b97 第二种&#xff1a; char c a; int b c; // b97 而一个ASCII码转换成相应字符则仅需强制转换&#xff1a; int a 97; char c (char)a; // ca ACM试…

DotNET多线程使用初探

最近几周一直在做DotNET WinForm开发&#xff0c;陆陆续续有些收获&#xff0c;希望能够有空好好整理整理。记下来以免以后又忘了。:-) 一、最简单的线程使用方法 新建一个C# Windows应用程序项目&#xff0c;在最前面的引用代码那增加一行using System.Threading;在界面上扔个…

Linux mount: Structure needs cleaning 错误解决方法

“mount: Structure needs cleaning”报错可以使用xfs_repair来修复&#xff0c;但是要注意 xfs_repair修复的分区中的文件都会丢失&#xff0c;即使是du能正常显示的文件也会丢失。 [rootyw-0-0 /]# mount -a mount: Structure needs cleaning[rootyw-0-0 /]# xfs_repair /dev…

大数据——Spark学习笔记(配置)

Spark运行环境 spark ui web http://hadoop102:8080 历史服务器 http://hadoop102:18080 一. 本地模式(Local)——单机运行 本地模式&#xff1a;运行 bin/spark-shell提交应用&#xff1a;运行 bin/spark-submit --class org.apache.spark.examples.SparkPi …

Linux软件安装——安装软件的命令

Linux软件安装——安装软件的命令 摘要&#xff1a;本文主要学习了如何在Linux系统中安装、更新、卸载软件。 rpm命令 rpm命令用来在Linux系统上进行软件的安装。 基本语法 安装命令&#xff1a; 1 rpm -ivh 包全名 如果没有安装则安装&#xff0c;如果已经安装则升级&#xff…

JavascriptHelp

阅读全文&#xff1a;http://www.cckan.net/forum.php?modviewthread&tid147usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.Web…

GoLang之方法与接口

GoLang之方法与接口 Go语言没有沿袭传统面向对象编程中的诸多概念&#xff0c;比如继承、虚函数、构造函数和析构函数、隐藏的this指针等。 方法 Go 语言中同时有函数和方法。方法就是一个包含了接受者&#xff08;receiver&#xff09;的函数&#xff0c;receiver可以是内置类…