数组是一个什么玩意:

数组和指针我的理解,有同样之处也有不同之处。因有同样之处,因此一些资料上说,数组和指针本质是同样的。因有不同之处,因此也有一些资料上说,数组和指针是不一样的。

同样之处:

数组名字和指针名字都代表了一个地址。

如:int num[10];num是数组名。函数开辟了一个存储十个整数类型的空间,而num是他们的首地址。

int *p;

p=(int *)malloc(10*sizeof(int));类似的,p也指向了首地址。

不同之处是,num[10]中的空间位置是在栈中,而 ×p指向的空间是在堆中。

p能够指向别的地址(即p能够进行指针运算。是一个变量)可是num不能够运算,是一个常量。

一维数组与指针数组:

int num[5]={1,2,3,4,5};

引用的时候:printf("%d",num[i]);

int *num2[5]={&n1,&n2,&n3,&n4,&n5};

引用的时候:printf("%d",*num[i]);

二维数组:

int num[i][j];





能够用malloc创建数组:

int *pv=(int *)malloc (5*sizeof(int));

for(i=0;i<5;i++)

p[i]=i+1;//*(p+i)=i+1;

指针的一维数组:

int *arr[5];

int i;

for(i=0;i<5;i++)

{

    arr[i]=(int *)malloc(sizeof(int));

    *arr[i]=i;

}

或者:

*(arr+i)=(int *)malloc(sizeof(int));

**(arr+i)=i;

另外一种分析: (arr+i)表示数组第i个元素的地址。我们须要改动这个地址中的内容,因此用了×(arr+i)而 arr+i的内容是一个指针,指向一个内存。因此再此解引。返回的是所分配内存的位置。

二维数组的传递:

以2.c为样例。尽管是二维数组,可是 在函数中,是以一维数组来使用的。由于声明中就是一维数组。所以在子函数中无法以arr[i][j]的方式来使用数组里的内容。仅仅能用

arr+偏移量 然后解引的方式: *(arr+(i*cols)+j)

也能够动态分配二维数组:

int rows2;

int columns=5;

int **matrix=(int **)malloc(rows*sizeof(int *));//类型是二维数组。里面的每个元素是一个整形指针。

for(i=0;i<rows;i++)

{

    matrix[i]=(int *)malloc(colums*sizeof(int));//每个元素都指向一个整形一维数组。

}

该方式类似于參考 字符串指针的表示方式。

代码演示样例:

1//指针数组:

#include <stdio.h>

int main(void)

{

    int* num1[3];

    int num2[3]={1,2,3};

    int i;

    for(i=0;i<3;i++)

num1[i]=&num2[i];

    for(i=0;i<3;i++)

printf("%4d",*num1[i]);

    putchar('\n');

    return 0;

}

2/二维数组的表示:

#include <stdio.h>

void arr_initial(int *arr,int rows,int cols)

{

    int i,j;

    int num=1;

for(i=0;i<rows;i++)

  for(j=0;j<cols;j++)

  {

     *( arr+(i*cols)+j)=num++;

  }

}

void arr_print(int *arr,int rows,int cols)

{

    int i,j;

    int num=1;

for(i=0;i<rows;i++)

{for(j=0;j<cols;j++)

  {

     printf("%4d",*( arr+(i*cols)+j));

  }

  putchar('\n');

}

}





int main(void)

{

    int num1[5][6];

    int num2[7][8];

    arr_initial(&num1[0][0],5,6);

    arr_print(&num1[0][0],5,6);

    arr_initial(&num2[0][0],7,8);

    arr_print(&num2[0][0],7,8);

    return 0;

}

&lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组的更多相关文章

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段 代码工程地址: https://github. ...

  2. UNP学习笔记(第十四章 高级I/O函数)

    本章讨论我们笼统地归为“高级I/O”的各个函数和技术 套接字超时 有3种方法在涉及套接字的I/O操作上设置超时 1.调用alarm,它在指定超时时期满时产生SIGALRM信号 2.在select中阻塞 ...

  3. The Definitive Guide To Django 2 学习笔记(七) 第四章 模板 (三)使用模板系统

    接下来,我们开始学习如何使用模板系统,但我们并不和前面说的View相结合,我们的这里的目的是展示模板系统是如何独立于Django框架运行的.下面是在pyhon代码中使用Django模板系统的基础例子: ...

  4. apue学习笔记(第十四章 高级I/O)

    本章涵盖了从多概念和函数:非阻塞I/O.记录锁.I/O多路转换.异步I/O.readv和writev函数以及存储映射I/O 非阻塞I/O 非阻塞I/O使我们可以发出open.read和write这样的 ...

  5. The Definitive Guide To Django 2 学习笔记(八) 第四章 模板 (四)基本的模板标签和过滤器

    标签 下面的部分概述了常见的Django标签. if/else {%if%} 标签 对一个变量值进行测试,如果结果为true,系统将会显示在{%if%} 和 {%endif%}之间的一切,看个例子: ...

  6. The Definitive Guide To Django 2 学习笔记(六) 第四章 模板 (二)使用模板系统

    模板系统不是django特有的,它是python的一个库,你可以在任何地方使用它. 使用方法: 1.使用 Template()方法创建Template对象.2.调用Template对象的render( ...

  7. The Definitive Guide To Django 2 学习笔记(五) 第四章 模板 (一)基本模板系统

    引入模板系统的原因,view中引入硬编码并非明智的选择,设计上的任何改变都会需要改动代码.python代码和HTML代码应该分开,这是多数Web站点的共识,分开会提高效率. 基本模板系统 Django ...

  8. 流畅python学习笔记:第十四章:迭代器和生成器

    迭代器和生成器是python中的重要特性,本章作者花了很大的篇幅来介绍迭代器和生成器的用法. 首先来看一个单词序列的例子: import re re_word=re.compile(r'\w+') c ...

  9. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

随机推荐

  1. 浅谈Struts2(三)

    一.Struts2收集client的参数 核心思路: <form method="post" action="XXXX"> <input ty ...

  2. CD key 生成

    题目描述如下: 某欧软件需要实现简易的CD-KEY算法,输入3个正整数,以空格隔开,根据者3个正整数生成的cd-key字符串.输出格式:xxxx-xxxx-xxxx-xxyy. 包含16个字符,以短划 ...

  3. (转)CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  4. LOJ 1341 Aladdin and the Flying Carpet(质因子分解)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1341 题意:给两个数a,b,求满足c * d = a且c>=b且d>=b的 ...

  5. Jquery对select的操作(附日历天数变化代码)

    转载请注明出处. 逃不开传统的四种操作:增.删.改.查. <四处搜刮了jquery对select操作的代码,汇集一下,方便以后查看.日历天数变化代码为原创.> [增]: $("# ...

  6. 模拟JQUERY的延迟方法绑定

    模拟JQUERY的延迟方法绑定, 对于延迟方法绑定,各种语言都有不同的描述 什么回调啊,函数指针啊,委托啊,事件啊等,其实也就是那么大回事,不过用好这些特性,对于扩展和架构是非常有好处的, 好处自然就 ...

  7. 高质量程序设计指南C/C++语言——内存管理

    • free()和delete只是把指针所指的内容给释放掉,并没有把指针本身删掉.指针被free()或delete以后其地址仍然不变(不等于NULL),只是该地址对应的内存是垃圾——p成了野指针.如果 ...

  8. Google日历添加农历、节日和天气插件(步骤)

    Google日历添加农历.节日和天气插件(步骤) Google功能非常多,Google日历只是其中一个,而且支持Exchange账户(iPhone,WP7,诺基亚等)和Google账户登录(andro ...

  9. SpringMVC之访问静态文件

    我们在进行springMVC开发时,必定会在jsp页面引入js文件.img文件和css文件.大多数人会将这些分类存放在WebRoot文件下新建的文件夹下面.同时,会在web.xml文件中配置拦截所有请 ...

  10. 基于Visual C++2013拆解世界五百强面试题--题4-double转换成字符串

    请用C语言实现将double类型数据转换成字符串,再转换成double类型的数据.int类型的数据 想要完成题目中的功能,首先我们的先对系统存储double的格式有所了解. 浮点数编码转换使用的是IE ...