C语言 - 最简单,最易懂的指针、引用讲解

这篇具有很好参考价值的文章主要介绍了C语言 - 最简单,最易懂的指针、引用讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言 - 最简单,最易懂的指针、引用讲解,# C/C++,c语言,开发语言

一、变量、地址、变量值

C语言 - 最简单,最易懂的指针、引用讲解,# C/C++,c语言,开发语言
C语言 - 最简单,最易懂的指针、引用讲解,# C/C++,c语言,开发语言

二、直接上代码,一边看上图,一边讲解

#include <stdio.h>

struct Hello
{
    int a;
    int b;
};

int main()
{
    struct Hello h;
    h.a = 10;
    h.b = 20;

    struct Hello *hp;
    hp = &h;
    printf("1: h的地址是%d,hp地址是%d \n", &h, &hp);
    printf("2: h的地址是%p,hp地址是%p \n", h, hp);
    return 0;
}

输出结果如下:

1: h的地址是6291096,hp地址是6290920
2: h的地址是000000140000000a,hp地址是00000000005ffe98

先看这一行

printf("1: h的地址是%d,hp地址是%d \n", &h, &hp);

都知道& 是取址符是吧,好,&h 是取h结构体的地址,结果没问题,参照上图。
接着,&hp,hp是一个指针,指向了h所在的地址(hp = &h),注意:&hp是取hp变量的地址,而不是h的地址,所以打印出来的是 6290920。(printf %d是打印数字,这里输出的是10进制的结果)

再看第二行

printf("2: h的地址是%p,hp地址是%p \n", h, hp);

此处的 %p 是指打印指针变量的值,好,先看第二个参数hp,它本身是一个指针变量,值是 0x5ffe98,所以打印出的结果也是没问题的。再看第一个h的打印结果,000000140000000a 这明显是一个不太正常的结果。原因是,这里的用法有问题,h是一个结构体,不是一个指针变量。但程序既然把h传进来了,就按照h存储的值进行打印,所以推断出h处的变量值是 000000140000000a
C语言 - 最简单,最易懂的指针、引用讲解,# C/C++,c语言,开发语言
上面的虚线框内的逻辑是错的,实际不存在的。通过这个图能表达出上面的错误写法。

回顾一下:
printf 1 中的&h、 printf 2 中的 hp,它俩是一样的作用,结果也是对的,就是h结构体的地址,只不过一个10进制、一个16进制输出。

printf 1 中的&hp
6290920 是 hp指针变量自己的地址
printf2 中的h
000000140000000a 一看这个值是不太正常,是因为本身是个错误用法,把h这个结构体对象当成指针传入 printf 了。
C语言 - 最简单,最易懂的指针、引用讲解,# C/C++,c语言,开发语言

三、深入 &

所谓的取址运算符,其实不准确,会有误导的成分在。
看代码:

#include <stdio.h>

struct Hello
{
    int a;
    int b;
};

int main()
{
    struct Hello h;
    h.a = 10;
    h.b = 20;

    struct Hello harry[20];

    harry[0] = h;
    int address1 = &(harry[0]);
    printf("address1 is:%d", address1);

    return 0;
}

定义了一个Hello结构体数组,我想取第一个元素所在的地址。以上代码可以正常运行,结果如下:

address1 is:6290928

但是,编译器会在 &(harry[0]) 这里报出一个问题:

initialization of 'int' from 'struct Hello *' makes integer from pointer without a cast [-Wint-conversion]

就是说,类型不适配,为什么不适配呢?上面第一段代码运行时,&打印出了一个10进制的地址,这里用一个int 类型变量承接,没问题啊。

莫非 & 的返回值类型不是 int ?
确实:

在C语言中,&操作符用于获取变量的内存地址。它的返回值类型是 void*,即一个指向任何类型的指针。

具体来说,如果&操作符用于一个整数变量,它将返回一个指向该整数的指针。同样地,如果它用于一个浮点数变量,它将返回一个指向该浮点数的指针。因此,&操作符的返回值类型取决于它所操作的变量类型。

需要注意的是,返回值类型为 void*,这意味着在使用返回的指针之前,通常需要将其转换为正确的指针类型,以便正确地访问和操作内存地址。

正确的写法,应该是这样:

struct Hello* ptr = &(harry[0]);
printf("Address of the 0 element is:%p", ptr);

使用一个指针 ptr 去承接 &的返回值,然后将指针的值打印出来,就是数组第一个元素的地址了。

就这么简单!!
喜欢请关注、收藏、分享 ~(~ ̄▽ ̄)~

C语言 - 最简单,最易懂的指针、引用讲解,# C/C++,c语言,开发语言文章来源地址https://www.toymoban.com/news/detail-782745.html

到了这里,关于C语言 - 最简单,最易懂的指针、引用讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言指针操作(七)通过指针引用字符串

    通过指针引用字符串详解,以及字符指针变量和字符数组的比较、 在平常的案例中已大量地使用了字符串,如在 printf函数中输出一个字符串。这些字符串都是以直接形式 (字面形式) 给出的,在一对双引号中包含若干个合法的字符。在本节中将介绍使用字符串的更加灵活方便

    2024年02月03日
    浏览(52)
  • C 语言指针完全指南:创建、解除引用、指针与数组关系解析

    我们可以使用引用运算符 获取变量的内存地址: 指针是一个将另一个变量的内存地址作为其值的变量。 指针变量指向一个数据类型(如 int )的相同类型,并使用 * 运算符创建。您正在使用的变量的地址被分配给指针: 示例解释: 创建一个名为 ptr 的指针变量,指向一个 i

    2024年02月03日
    浏览(61)
  • 8.3 【C语言】通过指针引用数组

    所谓数组元素的指针就是数组元素的地址。 可以用一个指针变量指向一个数组元素。例如: int a[10]={1,3,5,7,9,11,13,15,17,19}; int *p; p=a[0]; 引用数组元素可以用下标法,也可以用指针法,即通过指向数组元素的指针找到所需的元素。 在指针已指向一个数组元素时,可以对指针进

    2024年02月12日
    浏览(45)
  • C++实现单链表【每一步详细深入讲解,代码清晰、简单、易懂】

    0、overview 链表元素由数据和指针构成,因此链表的节点可以由一个包含这两种元素的结构体代表: 链表包含插入、删除操作,而插入、删除又必须先查找元素是否存在,因此查找方法也必不可少。 1、插入操作 例如:我们需要在伪头节点(不包含数据)和含有1的节点之间插

    2024年02月08日
    浏览(44)
  • 8.4 【C语言】通过指针引用字符串

    在C程序中,字符串是存放在字符数组中的。想引用一个字符串,可以用以下两种方法。 (1)用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明“%s”输出该字符串。 例:定义一个字符数组,在其中存放字符串“I love

    2024年02月11日
    浏览(35)
  • 【C语言】-- 一篇带你了解指针,内存,解引用

    目录 1、什么是指针? 1.1 内存 1.2 指针变量 二、指针和指针类型 1、指针类型 2、指针+整数 3、指针的解引用 三、野指针 1、野指针成因 (1) 指针未初始化 (2) 指针越界访问 (3) 指针指向的空间释放 2、如何规避野指针 四、指针运算 1、指针-指针        本篇文章我们来了解C语

    2024年02月16日
    浏览(58)
  • 【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】一、入门知识讲解 (C++、命名空间、C++输入输出、缺省参数、函数重载)-

    2024年02月04日
    浏览(68)
  • C语言:结构体详解(简单易懂)

    前言: 我们在前面的C语言学习过程中,学习了各种数据类型,例如:整型数据类型、字符型数据类型,浮点型数据类型等,这些数据类型的设计都是为了对实际生活中的各种数据进行在计算机上的储存,但我们生活中还有一些数据无法使用以上单一的数据类型进行描述,例

    2024年02月01日
    浏览(49)
  • C语言-指针讲解(3)

    在上一篇博客中: C语言-指针讲解(2) 我们更为深层地给大家介绍了指针的其他基础用法 让下面我们来回顾一下讲了什么吧: 1.野指针指向的位置是不可知的。我们只有做到: 对指针初始化 小心数组越界 当指针变量不再使用时,应及时置NULL,指针使用之前检查有效性。 才

    2024年02月04日
    浏览(39)
  • C语言-指针讲解(4)

    在上一篇博客中: C语言-指针讲解(3) 我们给大家介绍了指针进阶的用法 让下面我们来回顾一下讲了什么吧: 1.字符指针变量类型以及用法 2. 数组指针本质上是一个指针,里面存放数组的地址。而指针数组本质上是个数组,里面存放的是指针,指向的是整型数组。 以及数组指

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包