美文网首页c/c++
c语言 - *指针 和 &地址

c语言 - *指针 和 &地址

作者: Yasuo_4a5f | 来源:发表于2019-06-05 16:08 被阅读109次

最近在研究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));
  • 2.写一个标准宏Max,并给出以下代码的输出
int Max(int a,int b)
{
    return a>b?a:b;
}

int array[5] = {1, 3, 5, 7, 9};
int *p = &array[0];
int max = Max(*p++, 1);
printf("%d %d", max, *p);

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

4.链表和数组的区别

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

相关文章

  • c语言 - *指针 和 &地址

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

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • 闲聊c/c++: 谈内存(大/小端,高/低字节,高/低地址)

    c/c++和其他语言最大区别在于: 指针 指针就是内存地址,一旦明白了指针与内存地址相关的内容,那理解其他语言,就...

  • [C]C语言指针

    Blog C语言指针详解 C语言字符串操作 指针的作用 指针是程序数据在内存中的地址,指针变量是用来保存这些地址的...

  • Go语言指针

    只讲述和C语言地址的不同 格式:var 指针名称 *数据类型var 指针名称 *数据类型 = 地址 指向数组的指针...

  • 容易迷糊的C/C++语法及计算机存储容量单位bit、 byte、

    参考 C语言中的*和&符号 c语言 基本运算 1、*、 & 指针地址和具体内容 int a = 10; // a是...

  • Go语言 指针

    指针 概念 Go语言的指针和C语言一样也是用来保存地址的变量 格式 普通指针 指向数组的指针 注意点 GO语言中只...

  • 2.7-C语言入门-指针

    1.指针的含义-变量的地址 a.指针:C语言中用“指针”来表示内存地址(即:指针指向了内存地址),即“指针”可理解...

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • 值传递、地址传递的笔记

    在C语言中,理解值传递、地址传递和引用传递非常重要,首先,我们得来区分一下指针变量、指针地址、指针的值之间的关系。...

网友评论

    本文标题:c语言 - *指针 和 &地址

    本文链接:https://www.haomeiwen.com/subject/iogjxctx.html