2015-07-17 13:23 编辑

前面我们介绍了关于C语言的内存分配问题,下面我们就开始介绍关于C语言的两个非常重要的知识点:数组与指针

数组与指针其实不仅仅是再C语言中,再OC中(当然OC是内部已经帮我们处理好了,但是还有存在大量的指针),C#中,C++中等待一些开发中都是非常常见的,所以作为一个程序员是必须掌握的。

一、数组:相同类型的集合

1:一维数组

平时我们都是申明一个变量,那么如果变量很多我们要怎么做呢,这个时候我们就能用到数组,那么什么是数组呢?

首先来看一个实例:

#include<stdio.h>

int main(void)

{

  int a [20];

  这里我们称a为为20个元素的数组;每个元素都是你听类型,当然你也可以申明成其他类型(注意哦:这里是一次性申明的)

  其中[]里面的数字表示下表:a[0]。。。。a[19]

  return 0;

}

数组就是数据的整合。

    比如整型数组的定义的格式如下:

int 变量名[元素个数];

例:int a[10]; 接着就是数据是怎么存放到整型数组中的,数组的存放有一下几种方式:

  • 在定义的时候赋值      int a[5]={0,1,2,3}
  • 在定义时时候对单赋值      int b[9]={[4]=5,[7]=2};
  • 在定义时时候不赋值         int c[6];   a[2]=1; a[3]=4;

既然数据可以存放多个数据,它在内存中是这么存放的:

注:数组不能整理赋值:如a = b;
  
下面给大家看一个实例:

int main()
{
    char cs[5]={'1','2','3','4','5'};

return 0;
}

注:内存给数组分配也是从大到小根据占据字节分配,依次的从上到下存放数据,并且cs的地址就是它的首地址即cs[0],和存储变量的方式很雷同,只不过没有转换成二进制。

2:二维数组

  其实:在存储数据如果使用数组,难免有些不足,那么就有了二维数组,二维数是数组的数组,或者把它看成两个一维数组。

        二维数组可以存放的数据比一维数组要多的多,实际上就是两个一维数,数组的输入和输出方式可以用for循环来实现:

3:数组中的sizeof和strlen介绍

sizeof:求所占字节数需要算上'\0'

   strlen:是单纯求字符串的长度,需要加头文件string.h

下面看一个实例:

看下面代码

int i,a[]={3,4,5,6,7,3,7,4,4,6};
for (i=0;i<=9;i++)
{
  printf ( “%d”, a[i] );
}

很显然,它是显示a 数组的各元素值。

我们还可以这样访问元素,如下

int i,a[]={3,4,5,6,7,3,7,4,4,6};
for (i=0;i<=9;i++)
{
  printf ( “%d”,  *(a+i) );
}

它的结果和作用完全一样

二、指针:(是一个变量)

指针是一个8字节的变量,

#include<stdio.h>

int main(void)

{

int a;

int *p = &a;//取地址符,把吖的地址放到p里面!

printf("%ld\n", sizeof(o),sizeof(int *));

return 0;

}

   C语言的核心就是指针,指针可以操作内存,间接性的修改内存里的数据。

  指针类型:

  1.     有数组指针,
  2.     字符指针,
  3.     字符串指针,
  4.     指针的指针,
  5.     函数的指 针,
  6.     结构体的指针
  7.     。。。

1. 数组指针,顾名思义就是定义一个指针,指针里存放的值就是数组的地址。

}

2.字符指针就是单个字符的指针,比较关注的还是字符串指针,也就是字符数组指针,但是在定义时完全可以用指针去代替,例如:

char *name="minglei";    //字符串常量

一般的定义是:

char name[10];           //字符串变量

char *n=name;

我们定义一个指针指向指针的指针;

  • int a=5;         变量a的数据类型为int
  • int *p=a;        指针p的数据类型为int *
  • int **pp=p;      指针pp的数据类型为int **

只要记住(数据类型 *)是一体的就很容易理解了。

3. 数组名与指针变量的区别

请看下面的代码:

int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};
  pa =a;
  for (i=0;i<=9;i++)
  {
    printf ( “%d”, *pa );
    pa++ ;  //注意这里,指针值被修改
  }

可 以看出,这段代码也是将数组各元素值输出。不过,你把{}中的pa改成a试试。你会发现程序编译 出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针 常量。这个代码与上面的代码不同的是,指针pa在整个循环中,其值是不断递增的,即指针值被修改了 。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:a++.前面4,5节中pa[i],*(pa+i )处,指针pa的值是使终没有改变。所以变量指针pa与数组名a可以互换。

注:指针还可以进行加减运算

将数组与指针结合使用:

指针数组
  一个指针数组是指一个数组中的每个元素都是一个指针,例如:

int *p[10];//而不能是int (*p)[10]

或者

char *p[10];

此时p是一个指针(数值上和&p[0]一样);
在前面有int t[10];

int * pt=t;//使用pt指向t

那么这里我们用什么指向int *t[10]中的t呢?我们要使用一个指针的指针:

int **pt=t;

  这是因为:在int *t[10]中,每个元素是指针,那么同时t又指向这个数组,数组上和&t[0]相同,也就是指向t[0],指向一个指针变量,可以说是一个指针的指针了,所以自然要用

int **pt;

同样这里我以一个图弄清楚数组与指针:

如果你能看懂这个(结果是什么?),那么你就把数组与指针基本上入门了,记住知识入门哦!

iOS开发——C篇&数组与指针的更多相关文章

  1. iOS开发UI篇—字典转模型

    iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 // // LFViewController.m // 03-应用管理 // // Creat ...

  2. iOS开发UI篇—IOS开发中Xcode的一些使用技巧

    iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文 ...

  3. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> ...

  4. iOS开发UI篇—核心动画(关键帧动画)

    转自:http://www.cnblogs.com/wendingding/p/3801330.html iOS开发UI篇—核心动画(关键帧动画) 一.简单介绍 是CApropertyAnimatio ...

  5. iOS开发数据库篇—SQLite的应用

    iOS开发数据库篇—SQLite的应用 一.简单说明 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件. 导入头文件,可以使用库中的函数(是纯C语言的) 二 ...

  6. IOS开发数据库篇—SQLite模糊查询

    IOS开发数据库篇—SQLite模糊查询 一.示例 说明:本文简单示例了SQLite的模糊查询 1.新建一个继承自NSObject的模型 该类中的代码: // // YYPerson.h // 03- ...

  7. iOS开发UI篇—简单的浏览器查看程序

    iOS开发UI篇—简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件 ...

  8. iOS开发UI篇—从代码的逐步优化看MVC

    iOS开发UI篇—从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他 ...

  9. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

随机推荐

  1. poj1009

    题目大意:边缘检测 IONU卫星成像公司,公司记录和储存非常大的图片使用行程编码,你需要编写一个程序读取被压缩的图像,发现图像的边缘,描述如下,并且输出另一个发现的边缘压缩图像. 一个简单的边缘检测算 ...

  2. 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程

    在OpenGL ES中,Shader是着色器,包括两种:顶点着色器(Vertex Shader)和片元着色器(Fragment Shader).每个program对象有且仅有一个Vertex Shad ...

  3. Java菜鸟学习笔记--Exception篇(一):异常简介

    什么是异常(Exception)? 简述: 在运行过程中,应用程序可能遭遇各种严重程度不同的问题.异常提供了一种在不弄乱程序的情况下检查错误的巧妙方式.它也提供了一种直接报告错误的机制. 不同类型异常 ...

  4. [PWA] 18. Clean the photo cache

    We cannot let photo always keep caching new data without clean the old data. If message is not displ ...

  5. opengl 函数

    ( 7 )光栅化.象素操作函数. 像素位置 glRasterPos*() .线型宽度 glLineWidth() .多边形绘制模式 glPolygonMode() ,读取象素 glReadPixel( ...

  6. RJ45口线序的理解

    RJ45线序就是TX_P / TX_N / RX_P / RX_N 四根线,分别用到的是1,2,3,6 因为TX要匹配RX,所以 线1 变成 另一端的 线3, 线2 变成 另一端的 线6 反过来也一样

  7. 提示用户体验的最佳免费 Jquery 表单插件

    网页表单是一个老生常谈的话题.出于这样或那样的目的,一些示例中都会包括用户注册,电子商务结算,用户设置甚至联系人表格.而输入栏是非常容易用现代的CSS3技术来应用样式.但是到底什么决定整体用户体验? ...

  8. VB php JAVA关于数据库连接数过多的解决方法

    这里讲解一个关于数据库连接多多的解决办法 一般都会在方法中进行数据库的开,利用和关 不过如果在一个循环里面使用的时候 这样数据库的连接数就会过多,如果是1万次的话,数据库服务器可能就会当机 PHP 中 ...

  9. Android开发笔记:安卓程序截屏方法

    1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...

  10. linux书籍推荐(转)

    ref: http://www.cnblogs.com/jiangjh/archive/2011/06/27/2091164.html#commentform 入门篇 <LINUX权威指南> ...