最近在研究oc的底层,全是c/c++的代码,虽然以前学过也写过,其实不怎么用都忘得差不多了。

首先我们来了解一下 * 和 &这两个符号

通俗点儿理解其实&地址就是就是一个存放地址的变量存储空间,当p指针指向某个变量,这时这个p指针里就存放了那个变量的地址。这就是我们常说的指针指向一个地址,意思是通过它能找到以它为地址的内存单元。利用指针我们可以直接获取变量中的值用,要是在指针前加 * 就是取其真值了(也就是被指向的变量的值)

//写一串代码

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

int * p = &arr[0];

首先初始化了在32位RAM处理器中的arr数组占20个字节(int 占用4个字节,32比特),然后我们定义了 一个int 类型的指针变量p,指针p指向了&arr[0] 也就是 arr数组的第一个元素地址。

声明中: * 表示指针,例如: int p,p是指针,指向整型量。p表示指针指向的整型量的值。

语句中,p表示指针指向的地址。如果p是指针,没有 &p 形式。二、 x指令:

声明中:a是整型量。&a是整型量a的地址,不是指针。

语句中:a是整型量a的值。&另一用途是按位运算符,按位* 是乘号。

此时此刻,你是不是对指针变量和地址有了一定的认知了。指针也不过如此嘛?

在此之前我们先看下下列问题

int arr[5] = {1,3,5,7,9};

arr = ?

arr[0] = ?

&arr = ?

&arr[0] = ?

&arr+1 = ?

&(arr + 1) = ?

lldb打印内容:

(lldb) po arr[0]

1

(lldb) po arr

(lldb) po &arr

0x00007ffeefbff4c0

(lldb) po &arr[0]

0x00007ffeefbff4c0

(lldb) po &arr + 1

0x00007ffeefbff4d4

(lldb) po &arr[1]

0x00007ffeefbff4c4

(lldb) po (arr + 1)

0x00007ffeefbff4c4

(lldb) po *(arr + 1)

3

先打印了 arr[0] 等于1。

再打印了 arr 什么也没打印出来

再打印了 &arr arr数组的首地址

再打印了 &arr[0] arr数组首元素地址

再打印了&arr + 1未知地址

再打印了&arr[1] arr数组第二个元素的地址

再打印了 arr + 1 arr数组第二个元素的地址

在打印了 *(arr + 1) arr数组第二个元素

此时此刻 其实我们只有一个疑问 arr 到底是什么?

arr 是数组名称, &arr表示数组首地址,arr表示数组首元素地址

这个结论是怎么来的呢?

由arr + 1 和 &arr + 1的结果不同

说明一下 地址 + int

后面的int所代表的字节是根据当前地址类型来

假如前面的地址所代表的是元素类型地址那么所加的 元素字节为int * 单个元素的字节

假如前面的地址所代表的是数组类型地址那么所加的 元素字节为int * 数组的字节

然后再根据元素字节获取当前地址

arr + 1 是arr数组第二个元素的地址,所以arr表示数组首元素地址,&arr + 1未知地址 说明此时的地址已经越过了当前数组内的地址

int arr[5] = {1,3,5,7,9};

int * p = (int*)(&arr+1);

printf("%d\n",*(p-2));

打印7

此时此刻 p 指向&arr + 1的地址 ,也就是超越了数组界限的下一个地址。 我们用p-2往上走了8个字节,也就到了数组的倒数的第二个元素的地址。由此看来 &arr表示数组首地址。

那么猜想一下&arr +2的地址呢?

小试牛刀:

1.请写出以下代码输出

int a[5] = {1,3,5,7,9};

int *ptr = (int*)(&a+1);

printf("%d, %d", *(a + 1), *(ptr - 1));

解析:

&a : 代指 数组的整体 的地址,这里的 a是数组整体

a+1: 代指 数组的第一个成员,这里的 a是数组首地址

2.写一个标准宏Max,并给出以下代码的输出

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

int *p = &array[0];

int max = Max(*p++, 1);

printf("%d %d", max, *p);

参考答案: 1,2

#define Max(X, Y) ((X) > (Y) ? (X) : (Y))

当看到宏时,就会想到宏定义所带来的副作用。对于++、–,在宏当中使用是最容易产生副作用的,因此要慎用。

分析:

p指针指向了数组array的首地址,也就是第一个元素对应的地址,其值为1.

宏定义时一定要注意每个地方要加上圆括号

*p++相当于*p, p++,所以Max(*p++, 1)相当于:

(*p++) > (1) ? (*p++) : (1)

=>

(1) > (1) ? (*p++) : (1)

=>

第一个*p++的结果是,p所指向的值变成了2,但是1 > 1为値,所以最终max的值就是1。而后面的(*p++)也就不会执行,因此p所指向的地址对应的值就是2,而不是3.

扩展:如果上面的*p++改成*(++p)如何?

(*++p) > (1) ? (*++p) : (1)

=>

(2) > (1) ? (*++p) : (1)

=>

max = *++p;

=>

*p = 3,max = 3;

3.请写出c语言整型和字符型数组的所有定义方法,并根据该文章写出打印出的相对应的地址代表什么

4.链表和数组的区别

5.单向链表和双向链表的区别

6.请写出以下代码的输出

int i[] = {10, 20, 30, 40, 50};

int *pa[] = {i, i+2, i+1, i+4, i+3};

int **p = pa;

printf("Initial **p = %d\n", **p);//10

p++;

printf("After p++, the **p = %d\n", **p);//30

++*p;

printf("After ++*p, the **p = %d\n", **p);//40

**p++;

printf("After **p++, the **p = %d\n", **p);//20

++**p;

printf("After ++**p, the **p = %d\n", **p);//21

Initial **p = 10

After p++, the **p = 30

After ++*p, the **p = 40

After **p++, the **p = 20

After ++**p, the **p = 21

定义分析 : (右结合性)

int i[] = {10, 20, 30, 40, 50}; //定义一个一维整型数组

int *pa[] = {i, i+2, i+1, i+4, i+3};//定义一个指针数组pa,pa[0],pa[1]分别执行I数组的某一个元素的地址

int **p = pa;//定一个二重指针(指向指针的指针)p 指向的是pa的地址既&pa(既指针数组pa的首地址的地址),

printf("Initial **p = %d\n", **p);//10

p++;//p++ 运行后表示p指向针数组pa的首地址的下一个地址

printf("After p++, the **p = %d\n", **p);//30

++*p;//右结合性 相当于++(*p),*p表示指针数组pa的第二个元素的值既整型数组i的第3个地址,++后*p指向整型数组i的第4个地址,p指向指针数组pa的第二个元素的地址

printf("After ++*p, the **p = %d\n", **p);//40

**p++;//右结合性 相当于**(p++),此时p指向指针数组pa的第二个元素的地址,++后p指向指针数组pa的第三个元素的地址

printf("After **p++, the **p = %d\n", **p);//20

++**p;//右结合性 相当于++(**p),此时p指向指针数组pa的第三个元素的地址,**p则为整型数组的第二个元素的值,++后 **p = 21

printf("After ++**p, the **p = %d\n", **p);//21

c语言指针的地址存放,c语言 - *指针 和 地址相关推荐

  1. c语言文件可用代码存放,C语言 文件(示例代码)

    小白一个,看到有错误,希望指出,万分感谢 /**************************************************************** C语言文件概述: 一般文件 ...

  2. c语言一维数组如何存放,C语言一维数组教案

    <C语言一维数组教案>由会员分享,可在线阅读,更多相关<C语言一维数组教案(6页珍藏版)>请在人人文库网上搜索. 1.学 科:计算机科学与技术课 程:C语言程序设计课 题:一维 ...

  3. c语言整型如何存放,C语言的数据类型→整型数据

    整型数据 一.整型常量的表示方法:"整型常量"即"整常数". 在C语言中,整常数有三种形式表示: 十进制整数: 如:123.-456.4. 八进制整数,以0开头 ...

  4. c语言 浮点型数据怎么存放,C语言学习之浮点型数据存储

    C语言学习之浮点型数据 浮点数 浮点型数据分为单精度浮点型(float)和双精度浮点型(double). 单精度(float) 单精度浮点值 取值范围:1.2E-38 到 3.4E+38 精度:6 位 ...

  5. C语言指针详解——入门C语言指针,初级指针使用。

    原文地址:我的个人博客点击查看 C语言教程第二弹--指针详解 所有学过C语言的人都知道,C语言难在它的指针的使用和理解,今天,我带给大家C语言的指针的教程,供大家学习交流,如果有讲的不对的地方,请给作 ...

  6. 进阶C语言 - 指针(3):函数指针数组

    目录 6. 函数指针数组 那么函数指针数组有什么用呢? 写一个计算器:实现简单的加减乘除 函数指针和函数指针数组的区别: 用函数指针和函数指针数组来实现计算器的区别: 6. 函数指针数组 函数指针数组 ...

  7. C语言第十七课:初阶指针

    目录 前言: 一.指针是什么: 1.那么指针到底是什么呢? 2.内存中的数据存储原理: 3.数据存储与指针使用实例: 4.存储编址原理: 二.指针和指针类型: 1.决定了指针的步长: 2.决定了对指针 ...

  8. java定义一个指针类型变量赋值吗,C++中指针的数据类型和运算相关知识小结

    C++有关指针的数据类型和指针运算的小结 前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下. 1) 指针变量加/减 一个整数 例如:p++,p--,p+i,p-i,p+-i, ...

  9. c语言多维数组指针地址讲解,C语言入门之多维数组的指针变量

    一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000,各下标变量的首地址及其值如图所示. 在前面曾经介绍过, ...

最新文章

  1. 云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?
  2. 吴恩达 ML作业提交:Grader sent no response
  3. ipad和android平板应用程序,Android平板要比iPad差吗?
  4. 数据智能构建管理平台Dataphin V2.9.4.3版本发布
  5. 【基础知识】 之 Binary Search Tree 二叉搜索树
  6. sshd_config配置详解
  7. 计算机网络和通信,计算机网络与通信技术
  8. 张勇:新技术是阿里“五新战略”的引擎
  9. 有道词典Mac版崩溃信息
  10. vscode: remote-ssh下与阿里云端编程
  11. Python爬虫QQ空间
  12. 教师档案管理信息系统
  13. 21.手绘Spring IOC运行时序图
  14. celeron处理器_桌面级【CPU】处理器简介——之【intel】篇
  15. 金蝶软件 CITRIX无法打印解决方案
  16. linux系统设置密钥登录
  17. Java集合底层原理理解
  18. 简单了解的分布式术语
  19. 服务器内存不足导致程序(tomcat)崩溃
  20. 【精品】Thymeleaf 语法基础

热门文章

  1. 爸爸拉合弦飞鸽传书源代码
  2. HTML5 飞秋官方下载 fps 也为咱国人争点脸
  3. 飞鸽传书局域网聊天工具
  4. 针对SQL INJECTION的SQL SERVER安全设置初级篇
  5. 一个优秀的程序员应该如何提高工作效率?
  6. 一个程序员面试因为吸烟而被拒
  7. java控制台输出方式,JAVA控制台输出格式
  8. 外国小哥,把整个 CNN 都给可视化了,卷积、池化清清楚楚!
  9. 这个只需一步就可做富集分析的网站还未发表就被CNS等引用超过350次
  10. android sp wp实例,android sp wp详解