第8章 数组

1.数组与指针

  数组名是一个个元素的地址。

  int  a[10];  int  b[10];  int  *c;

(1) c = & a[0]; &a[0]表示一个指向数组第1个元素的指针。

(2) c=a; 与 c = & a[0]; 等价

(3) b = a; 非法,不能使用赋值符把一个数组的所有元素复制到另一个数组,必须使用一个循环,每次复制一个元素。

(4) a = c; 非法,a是指针常量,而c是指针变量。

2. 下标引用和间接访问完全相同。

array[subscript]  <==>  *(array + (subscript))   (完全等价)

eg:int  array[10];

int  *ap=array+2;

(1)ap : <==> array + 2  <==> &array[2]

(2)*ap : <==> array[2]  <==>  *(array+2)

(3)ap [0] : <==>  *(ap + (0))  <==>  array[2]

(4)ap + 6 : <==>  array + 8  <==> &array[8]

(5)*ap + 6 : <==>  array[2]+6

(6)*(ap + 6) : <==>  array[8]

(7)ap [6] : <==>  array[8]

(8)ap[-1] : <==>  array[1]

(9)2[array] : <==>  *(2+(array))  <==>  *(array + 2)

3. 字符串常量的表示

(1) char  message1[ ] = “ hello “;    // 初始化一个字符数组的元素

(2) char  *message2 = “ hello “;     //真正字符串常量

指针常量message2 被初始化为指向这个字符串常量的存储位置。

  1. 4. 数组元素顺序存储

eg : int  array [3][6];

数组:

  


5. int  matrix [3][10];

matrix 这个名字的值是一个指向它第1个元素的指针,所以matrix是一个指向一个包含有10个整型元素的数组的指针。

       

(1)*(matrix +1) :指向整型的指针。子数组第1个元素地址。

(2)*(matrix +1)+5 :第6个元素的地址。

(3)*(*(matrix + 1) + 5 ) :<==>  matrix [1][5]

6.指向数组的指针

int  vector[10],  *vp = vector;      //正确

int  matrix[3][10],  *mp = matrix;    //错误

因为,matrix并不是一个指向整型的指针,而是一个指向整型数组的指针。

int  (*p) [10];   //声明一个指向整型数组的指针,p是指向整型数组的指针

int  (*p) [10] = matrix;  //声明+初始化

指向matrix的第1个整型元素:

(1)int  *pi = &matrix [0][0];

(2)int  *pi = matrix[0];

7.指针的兼容性

(1)int  *pt;

    int  (*pa) [3];

int  ar1 [2] [3];

int  ar2 [3] [2];

int  **p2;

则:

pt = & ar1 [0] [0] ;

pt = ar1 [0] ;

pt = ar1;     // 个int值构成的数组

pa = ar1;    //都指向int[3]

    pa = ar2;    //个int构成的数组,而ar2指向2个int构成的数组

    p2 = &pt;   // 都指向int *

     *p2 = ar2 [0];   //*p2类型为指向int的指针,所以和ar2 [0]兼容

     p2 = ar2;   //个int值构成的数组的指针。

因此,p2和ar2类型不同。

(2)将常量或非常量数据的地址赋给指向常量的指针是合法的。只有非常量数据的地址才可以赋给普通指针。

int  *p1;

const  int  *p2;

const  int  **pp2;

p1 = p2;      //非法,把const指针赋值给非const指针

p2 = p1;      //合法,把非const指针赋值给const指针,前提是只进行一层间接运算

pp2 = &p1;   //非法,把非const指针赋值给const指针

C和指针之学习笔记(3)的更多相关文章

  1. 02.C语言关于指针的学习笔记

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内 ...

  2. 《征服c指针》学习笔记-----统计文本单词数目的程序word_count

    1.程序的要求:对用户指定的英文文本文件(包括标准输入),将英文单词按照字母顺序输出到用户指定的文本文件中(包括标准输出),并且在各单词后面显示单词的出现次数. 2.模块设计: 主要分为:1.从输入流 ...

  3. &lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组

    数组是一个什么玩意: 数组和指针我的理解,有同样之处也有不同之处.因有同样之处,因此一些资料上说,数组和指针本质是同样的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 同样之处: 数组名 ...

  4. C和指针之学习笔记(6)

    第17章 经典数据结构类型 堆栈 堆栈接口提供三种基本的操作:push.pop 和 top. Push:把一个新值压入到堆栈的顶部. Pop: 只把顶部元素从堆栈中移除,它并不返回这个值. Top: ...

  5. C和指针之学习笔记(5)

    第10章 使用结构和指针 单链表 typedef struct NODE { struct NODE *link; int value; } Node; 插入到一个有序单链表: #include< ...

  6. C和指针之学习笔记(4)

    第9章 字符串 字符串的输入与输出 int  ch;  char strings[80];  FILE *input; (1)scanf(“%c”,&ch);   printf(“%c \n” ...

  7. C和指针之学习笔记(2)

    第6章 指针 1.在一组字符串中查找字符: #include<stdio.h> #include<assert.h> #include<stdlib.h> #def ...

  8. C和指针之学习笔记(1)

    第1章 1.输入字符串 while((ch=getchar())!=EOF  &&  ch!=’\n’) ; ch=getchar() while(ch!=EOF  && ...

  9. C语言学习笔记之成员数组和指针

    成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下.     单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...

随机推荐

  1. JVM调优总结(6):新一代的垃圾回收算法

    垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...

  2. 【洛谷】3375 KMP字符串匹配

    [算法]KMP [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> using n ...

  3. 深入理解Spring系列之十一:SpringMVC-@RequestBody接收json数据报415

    转载 https://mp.weixin.qq.com/s/beRttZyxM3IBJJSXsLzh5g 问题原因 报错原因可能有两种情况: 请求头中没有设置Content-Type参数,或Conte ...

  4. python进阶之内置函数和语法糖触发魔法方法

    前言 前面已经总结了关键字.运算符与魔法方法的对应关系,下面总结python内置函数对应的魔法方法. 魔法方法 数学计算 abs(args):返回绝对值,调用__abs__; round(args): ...

  5. adb_usb.ini在adb找不到设备时

    不能连接不上adb,如下方法解决,步骤描述不愿意看的话,直接使用本文最下面的批处理命令,方法copy粘贴到新建的bat文件里运行,或者直接粘贴到dos窗口运行. 1. 使用androidsdk目录中的 ...

  6. Battery Charging Specification 1.2 中文详解 来源:www.chengxuyuans.com

    1. Introduction 1.1 Scope 规范定义了设备通过USB端口充电的检测.控制和报告机制,这些机制是USB2.0规范的扩展,用于专用 充电器(DCP).主机(SDP).hub(SDP ...

  7. oracle造成系统CPU过高的检查sql

    1. 根据占用CPU高的进程号来查询这个进程执行的SQL语句: CPU过高的进程号: #首先找到CPU过高的进程号 # top -bn1 是静态找到占用最高的进程 [root@localhost ~] ...

  8. solr应用

    Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器.Solr比lucene提供了更多的查询语句,而且它可扩展.可配置,同时它对lucene的性能进行了优化. ...

  9. C# 多线程多文件批量下载---子线程中更新UI 实例

    代码1: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;usi ...

  10. python 爬图

    利用bs库进行爬取,在下载html时,使用代理user_agent来下载,并且下载次数是2次,当第一次下载失败后,并且http状态码是500-600之间,然后会重新下载一次 soup = Beauti ...