iOS学习07之C语言指针
本次随笔主要是为了学习和理解C语言中的指针,指针树状图如下:

1、访问数据的两种方式
1> 直接访问:定义变量后,直接访问变量
int a = ;
printf("a = %d\n", a);
2> 间接访问:先找到地址,根据地址访问变量的存储单元
图解

2、指针
1> 定义指针变量
类型修饰符 *指针变量名 = NULL;
NULL 表示空指针,相当于,用来给指针变量赋初始值
int *p = NULL;
p的类型: int *, p指向整数类型
通常情况下,把指针变量称为指针
p是指针,存储的内容是地址
2> 赋值(地址)
取址运算符: &
int *p = NULL;
int a = ;
p = &a;
printf("p存放的地址是:%p\n", p);
printf("变量a存放的地址是:%p\n", &a);
3> 取值
通过指针变量读取存储空间的数据
取值运算符:*
int *p = NULL;
int a = ;
p = &a;
printf("指针p指向的数据是:%d\n", *p);
4> 存储空间
指针的存储空间与操作系统有关
32位的操作系统,指针的存储空间占个字节
64位的操作系统,指针的存储空间占个字节
int *p = NULL;
int a = ;
p = &a;
printf("指针所占的位数:%lu\n", sizeof(p));
5> 区分指针中 * 的作用
定义指针变量时,int *p = NULL; 这个 * 用来描述 p 是一个指针变量
取值的时候, *p; 这个 * 是取值运算符
6> 指针的运算
指针只有加减运算,没有乘除运算
定义指针类型,决定了指针在运算时偏移几个字节
第一种: p + n
从 p 指向的存储空间开始,向高位偏移n个数据类型的字节数
p 的地址没有发生变化
int *p = NULL;
int a = ;
p = &a;
printf("%p\n", p);
printf("%p\n", p + );

第二种: p - n
从 p 指向的存储空间开始,向低位偏移n个数据类型的字节数
p 的地址没有发生变化
int *p = NULL;
int a = ;
p = &a;
printf("%p\n", p);
printf("%p\n", p - );

第三种: p++ (p = p + 1)
p 的指向发生改变
int *p = NULL;
int a = ;
p = &a;
printf("%p\n", p);
p++;
printf("%p\n", p);

第四种: p-- (p = p - 1)
p 的指向发生改变
int *p = NULL;
int a = ;
p = &a;
printf("%p\n", p);
p--;
printf("%p\n", p)

3、指针与数组
int arr[] = {,,,,};
int *p = NULL;
p = arr;
数组名是数组元素的首地址,故第3行的代码不能加 &
1> 通过指针访问数组元素
下标法
for (int i = ; i < sizeof(arr) / sizeof(int); i++) {
printf("arr[%d] = %d\n", i, p[i]);
}

指针法
通过指针偏移计算数组中的元素
不修改指针指向:* (指针变量(数组名) + 下标)
for (int i = ; i < sizeof(arr) / sizeof(int); i++) {
printf("指针变量\t + 下标\t: arr[%d] = %d\n", i, *(p + i));
printf("数组名\t + 下标\t: arr[%d] = %d\n", i, *(arr + i));
}

修改指针指向:*(指针变量++)
for (int i = ; i < sizeof(arr) / sizeof(int); i++) {
printf("指针变量\t + 下标\t: arr[%d] = %d\n", i, *(p++));
//printf("数组名\t + 下标\t: arr[%d] = %d\n", i, *(arr++)); // arr是数组的首地址,它是一个常量,故必能改变
}
第3行代码会报错

因为指针可以重定向,但是数组名是常量首地址,不可以修改
图解

2> 指针变量和数组的区别
1. 指针可以重定向,但是数组名是常量首地址,不可以修改
2. 不能通过指针计算数组元素的个数
指针的存储空间:4 或 个字节
数组的存储空间 = 元素个数 * 每个元素所占的字节数
3> 指针的类型一定要和数组元素的类型相匹配
short arr[] = {, , , };
int *p = arr;
char *q = arr;
printf("%d\n", p[]);
printf("%d\n", q[]);
运行结果:

图解


4、指针与字符串
char str[] = "shangtian";
char *p = str; printf("%s\n", str);
printf("%s\n", p); *p = 'S';
printf("%s\n", p); char *q = "xiadi"; // 常量字符串
printf("%s\n", q); *q = 'X'; // 运行会出现内存崩溃现象,
printf("%s\n", q);
第13行代码在运行时,会出现内存崩溃现象

因为 q 指向的是一个常量字符串,常量字符串不能进行修改

总结:指向常量的指针可以读取和修改数组元素,指向常量字符串的指针,只能读取,不能修改
5、指针数组
存放指针元素的数组
char *strArray[] = {"iPhone", "iPad", "iWatch"};// 指针数组:存放指针元素的数组
for (int i = ; i < ; i++) {
printf("%s\n", strArray[i]);
}
for (int i = ; i < ; i++) {
printf("%p\n", strArray[i]);
}
图解

6、指针与函数
// 指针与函数
void changeValue(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
} void printArray(int *p, int count) {
for (int i = ; i < count; i++) {
printf("%d\n", p[i]);
}
} int main(int argc, const char * argv[]) { // 指针与函数
int a = ;
int b = ; printf("a = %d, b = %d\n", a, b); changeValue(&a, &b); printf("a = %d, b = %d\n", a, b); // 指针表示数组
int arr[] = {, , , }; printArray(arr, );
图解

iOS学习07之C语言指针的更多相关文章
- iOS学习08之C语言内存管理
本次主要学习和理解C语言中的内存管理 1.存储区划分 按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区 1> 栈区:局部变量的存储区域 局部变量基本都在函数.循环.分支中定义 栈区的内 ...
- iOS: 学习笔记, Swift与C指针交互(译)
Swift与C指针交互 Objective-C和C API经常需要使用指针. 在设计上, Swift数据类型可以自然的与基于指针的Cocoa API一起工作, Swift自动处理几种常用的指针参数. ...
- 【IOS学习】【Swift语言】
基本语法: OS X playground 引入 import Cocoa IOS playground 引入 import UIKit 基本数据类型 let 定义常量 定义完成之后无法修改 var ...
- ios学习之旅---c语言函数
1.函数的概述 C源程序是由函数组成的. 尽管在前面各章的程序中大都仅仅有一个主函数main(),但有用程序往往由多个 函数组成. 函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能. C语 ...
- iOS 阶段学习第八天笔记(指针)
iOS学习(C语言)知识点整理 一.指针 1)概念:存储变量的地址的一个变量. 2) 数据存储类型分析 1.text (代码段) :存储二进制的可执行代码 2.data(初始化的数据段) 存储初始化的 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
- C语言指针学习
C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...
- 李洪强iOS开发之零基础学习iOS开发】【02-C语言】01-概述
前面已经给大家介绍了iOS开发相关的一些基础知识,其实iOS开发就是开发iPhone\iPad上的软件,而要想开发一款软件,首先要学习程序设计语言.iOS开发需要学习的主要程序设计语言有:C语言.C+ ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
随机推荐
- linux退出vi
linux退出vi操作,可以先按“esc”,再按“:”,“x”即可,这是要保存退出. 假如是修改过的,不保存,即是:先按 : ,然后输入 q! 回车 假如未改动,即先按 : ,然后输入 ...
- 无废话Android之常见adb指令、电话拨号器、点击事件的4种写法、短信发送器、Android 中各种布局(1)
1.Android是什么 手机设备的软件栈,包括一个完整的操作系统.中间件.关键的应用程序,底层是linux内核,安全管理.内存管理.进程管理.电源管理.硬件驱动 2.Dalvik VM 和 JVM ...
- C#委托(Action、Func、predicate)
Predicate 泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. public delegate boo ...
- .NET 在浏览器中下载TXT文件
通常我们用浏览器打开Txt文件时候,浏览器会直接打开,我们想要txt下载到本地该怎么操作,用js也可以,单不能兼容所有的浏览器,所以我们可以在服务端做处理,代码如下: //TXT文件生成页面 publ ...
- revert merge会出现的问题
比如当我们git revert的时候, git revert Git会抱怨: is a merge but no -m option was given 这是因为你revert的那个commit是一个 ...
- nodejs2
jade@1.11.0 严格注意缩进 extends layout block content h1= title p Welcome to #{title} - var a='abc'; p his ...
- 3-1创建Sql Sever数据库登录名
登录名:连接Sql Sever 服务器 数据库用户名: Sql Sever 的使用者 每个用来登录Sql Sever 的账户都是一个用户. 同一个数据库可以拥有多个用户,每一个用户也同时可以访问多个数 ...
- poj 3468【线段树】
题意:给定Q(1<=Q<=100000)个数A1,A2…AQ,以及可能多次进行的两个操作 1)对某个区间Ai……Aj的每个数都加n(n可变) 2)对某个区间Ai……Aj的数求和 分析: 树 ...
- JQuery经典小例子——可编辑的表格
可编辑的表格: 屏幕剪辑的捕获时间: 2015/8/14 9:16 HTML代码为: <!DOCTYPE html> <htmlxmlns="http://www.w3.o ...
- CF731C Socks并查集(森林),连边,贪心,森林遍历方式,动态开点释放内存
http://codeforces.com/problemset/problem/731/C 这个题的题意是..小明的妈妈给小明留下了n只袜子,给你一个大小为n的颜色序列c 代表第i只袜子的颜色,小明 ...