<深入理解C指针>学习笔记和总结 第四章 指针和数组
数组是一个什么玩意:
数组和指针我的理解,有同样之处也有不同之处。因有同样之处,因此一些资料上说,数组和指针本质是同样的。因有不同之处,因此也有一些资料上说,数组和指针是不一样的。
同样之处:
数组名字和指针名字都代表了一个地址。
如: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;
}
<深入理解C指针>学习笔记和总结 第四章 指针和数组的更多相关文章
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段 代码工程地址: https://github. ...
- UNP学习笔记(第十四章 高级I/O函数)
本章讨论我们笼统地归为“高级I/O”的各个函数和技术 套接字超时 有3种方法在涉及套接字的I/O操作上设置超时 1.调用alarm,它在指定超时时期满时产生SIGALRM信号 2.在select中阻塞 ...
- The Definitive Guide To Django 2 学习笔记(七) 第四章 模板 (三)使用模板系统
接下来,我们开始学习如何使用模板系统,但我们并不和前面说的View相结合,我们的这里的目的是展示模板系统是如何独立于Django框架运行的.下面是在pyhon代码中使用Django模板系统的基础例子: ...
- apue学习笔记(第十四章 高级I/O)
本章涵盖了从多概念和函数:非阻塞I/O.记录锁.I/O多路转换.异步I/O.readv和writev函数以及存储映射I/O 非阻塞I/O 非阻塞I/O使我们可以发出open.read和write这样的 ...
- The Definitive Guide To Django 2 学习笔记(八) 第四章 模板 (四)基本的模板标签和过滤器
标签 下面的部分概述了常见的Django标签. if/else {%if%} 标签 对一个变量值进行测试,如果结果为true,系统将会显示在{%if%} 和 {%endif%}之间的一切,看个例子: ...
- The Definitive Guide To Django 2 学习笔记(六) 第四章 模板 (二)使用模板系统
模板系统不是django特有的,它是python的一个库,你可以在任何地方使用它. 使用方法: 1.使用 Template()方法创建Template对象.2.调用Template对象的render( ...
- The Definitive Guide To Django 2 学习笔记(五) 第四章 模板 (一)基本模板系统
引入模板系统的原因,view中引入硬编码并非明智的选择,设计上的任何改变都会需要改动代码.python代码和HTML代码应该分开,这是多数Web站点的共识,分开会提高效率. 基本模板系统 Django ...
- 流畅python学习笔记:第十四章:迭代器和生成器
迭代器和生成器是python中的重要特性,本章作者花了很大的篇幅来介绍迭代器和生成器的用法. 首先来看一个单词序列的例子: import re re_word=re.compile(r'\w+') c ...
- 《深入理解Java虚拟机》学习笔记
<深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...
随机推荐
- UVa1586 Molar mass
#include <stdio.h> int GetQuantity(char* q, char** p){ int quantity = 0; while (*q & ...
- C++对象模型5--多继承下的对象模型
C++对象模型中加入多继承 从单继承可以知道,派生类中只是扩充了基类的虚函数表.如果是多继承的话,又是如何扩充的? 1) 每个基类都有自己的虚表. 2) 子类的成员函数被放 ...
- (Problem 74)Digit factorial chains
The number 145 is well known for the property that the sum of the factorial of its digits is equal t ...
- web压缩gzip响应
String data = "ggrgrgw4gergergregerge"; byte b[] = data.getBytes(); String gzipValue = req ...
- oracle整体知识的大致介绍(1)-概念
表空间: oracle允许不同类型的数据分开存放,表空间是数据库的逻辑划分. 数据文件: 表空间由同一磁盘上的一个或多个文件组成,这些文件叫做数据文件. 实例: 是存放和控制数据库的软件机制. ora ...
- Lotus Sametime
编辑 Lotus Sametime属于IBM旗下的Lotus软件,包括一个成熟的协作平台提供商. 外文名 Lotus Sametime 属 于 IBM旗下的Lotus软件 包 括 一个成熟 ...
- QT窗口拖拽功能简单应用(处理dragEnterEvent和dropEvent事件,不同的事件有不同的信息,比如mimeData)
void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); ui->lineEdit-> ...
- 关于Delphi中二维数组的声明和大小调整(对非基本类型数据,小心内存泄漏)
这是一个实例: procedure TMainForm.Button1Click(Sender: TObject);var arr:array of array of string;begin s ...
- Qt实战之开发CSDN下载助手 (3)(结束篇)
再次申明下,开发这款助手,主要是用来学习交流,并不是用来开发什么刷积分的软件. 好了,言归正传,这次,主要的分析下CSDN的下载,评论,验证码获取机制等等. 好,回到第二篇,当我们成功登陆时,CSDN ...
- cocos2d-x中的尺寸之一
cocos2d-x中的尺寸函数繁多,官方文档对各种尺寸没有很好的描述,网上文章更加寥寥,对尺寸和位置的理解如果不到位,写代码就非常困难,需要猜测尝试,效率低下.这个文章我将研究一些我所迷惑的尺寸函数, ...