printf 指针地址_c语言对指针的理解

先来讲一下本人学指针的经历:大一的时候刚接触c语言对指针这东西真的是太迷了,感觉麻烦难懂不想其他语言一样。但是搞懂以后就被指针的魅力吸引甚至喜欢上c语言。不多讲,开始!(文章可能有些长,但放心全是基础的东西,里面有实际的例子。)

理解变量的存储

int main()

{

    int a = 4;

    printf("%d\n", a);

    printf("%p", a);

    return 0;

}

结果:

4

00000004

(1)int a;

c语言在内存的存储是以栈的形式。在栈中先定义了一个变量a并在内存中开辟了大小为4个字节的空间。然后让a指向这片空间。此时小宝贝就有了自己的空间了,就可以放东西了,耶!

(2)a=4;

此时将4的值赋就是将4存到a的那片空间中。

由以上代码可知,第一个输出的是存放的值,第二个输出的是a空间的地址。

但是我们通常是不直接这样给变量赋值,往往是手动输入:

scanf("%d",&a);

用户先输入一个int型的值,&a先找到自己的那片空间(&是取地址符),然后经值转化为二进制存入到这个空间里。(嘿嘿,一个宝藏就这样存了进来)

找到宝藏的法宝——指针

既然有了自己的空间又有了值,那谁能知道我的地址来发现我的宝藏呢?哈哈,指针来了。

他来了,他来了,他真的来了,,,,,,,

首先要知道,指针指向的是地址,是地址,是地址!不要误以为他指的的是变量的值。

指针变量的定义与赋值:

第一种形式:

int *p=&a;

第二种形式:

int *p;

p=&a;

int *p;这里要区分,int*是在一起的,代表指针类型,p指的是指针变量。

多级指针

指向指针的指针,有时人们也管它叫多维指针。既然指针变量是一个变量,指针变量能存变量的内存的地址。

像 int * 存 int 型变量的地址,char * 存 char 型的地址,那指针理所当然可以存指针变量的地址啊。

例如,int ** 存 int * 的地址,int *** 存 int ** 的地址。

这就是一个二级指针存一级指针的地址,三级指针存二级指针的地址,人们把这样的过程叫指向指针的指针,但其实也就是一个上一级的指针存了下一级的指针的地址而已。

因此,像上面说的,你存了它的地址,你就是指向它,所以:

二级指针存一级指针的地址,那么可以说二级指针指向一级指针

三级指针存二级指针的地址,那么可以说二级指针指向一级指针

多级指针用处多多。

唉,怎么说呢,本人也是刚学c语言没多久,能力也有限,只是有自己的理解,例子还是请大家去实践。

指针的应用

1.作为参数的指针(指针变量作为函数参数):我们都知道在使用自定义函数时,每个自定义函数与主函数之间联系都是通过值传递的形式,但是并不能通过在自定义函数中改变参数的值来改变主函数中参数的值。但是通过指针,就能在自定义函数中访问主函数的变量了。

简单的例子:

void  fun(int *p);

int i=0;fun(&i)//因为自定义函数形参是指针,所以调用函数时传入地址。

这样在自定义的函数中就可以通过这个指针访问外面这个i

看几个代码的例子:

(1)不能通过在自定义函数中改变参数的值来改变主函数中参数的值:

voidchange(intp){printf("%d\n",p);//接受的值为5p=6;//想要改变参数的值}intmain(){intp=5;change(p);printf("%d\n",p);return0;}结果:55//值并没有发生改变

(2)利用指针后:

void change(int *p)

{

    printf("%d\n", *p);//接受的值为5

    *p= 6;//通过指针访问值,把p的值改为6

}

int main()

{

    int p=5;

    change(&p);//传入地址

    printf("%d\n", p);

    return 0;

}

结果:

5

6

//主函数的值发生改变

再看一个例子:利用自定义函数来比较三个数的大小

#include

//交换

void swap(int* p1, int* p2)

{

    int temp;

    temp = *p1;

    *p1 = *p2;

    *p2 = temp;

}

//compare

void compare(int* p1, int* p2, int* p3)//定义指针变量,利用指针和主函数中的变量联系

{

    if (*p1 > * p2)swap(p1, p2);

    if (*p1> * p3)swap(p1, p3);

    if (*p2> * p3)swap(p2, p3);

}

int main()

{

    int* p1, * p2, * p3, a, b, c;

    scanf_s("%d,%d,%d", &a, &b, &c);

    p1 = &a;//指针变量接收地址

    p2 = &b;

    p3 = &c;

    compare(p1, p2, p3);//自定义函数指针接收的仍是地址

    printf("%d,%d,%d", a, b, c);

    return 0;

}

2.双胞胎——指针还是数组?(用数组名做函数参数):

首先必须了解一个基本知识。

大家都知道一个数组有多个变量,那么如何访问数组中的变量(那么多宝藏怎么找啊)。数组是一个连续的空间,只要将首元素的地址赋给指针,指针通过首元素的地址访问到了数组的首元素,那么通过遍历的方法不就访问到了整个数组。(就像顺腾摸瓜一样)

赋值方式:

int *p;

p=&a[0];

//或者利用元素名:

int *p;

p=a;//a=&a[0]

先看下列伪代码:

代码一

void fun(int arr[],int n )

'''''''

''''''

int main()

int array[10]=,,,,

,,,,,,,

fun(array,10)

代码二

void fun(int *arr,int n )

'''''''

''''''

int main()

int array[10]=,,,,

,,,,,,,

fun(array,10)

这两个伪代码是等价的,即数组名作为函数参数时可以当做是指针。

原理嘛,允许我偷下懒哈哈,况且比我讲的明白,(接图):

b6a0a8134edfce044ad9188d739b520e.png

代码实例:

逆序输出数组中的数

void reversed(int a[], int n)//数组作为指针变量接收地址,int a[]等价于int *a

{

    int i, j, m = (n - 1) / 2,temp;

    for (i = 0; i <= m; i++)

    {

        j = n - 1 - i;//控制序列j

        temp = a[i];

        a[i] = a[j];

        a[j] = temp;

    }

    for (int i = 0; i < 5; i++)

        printf("%d\t", a[i]);//利用指针访问元素

}

int main()

{

    int a[5];

    int n = 5;

    for(int i = 0; i < 5; i++)

    {

        scanf_s("%d,", &a[i]);

    }

    for (int i = 0; i < 5; i++)

    {

        printf("%d\t", a[i]);

    }printf("\n");

    reversed(a, n);//数组名作为地址对函数进行调用

}

比较数组中数字的大小

void compare(int a[],int len,int *min,int *max)

{

        int i;

        *min =*max=a[0];

        for (i = 1; i < len; i++)

        {

               *max = a[i] > *max ? a[i] : *max;

               *min = a[i] < *min ? a[i] : *min;

        }

}

int main()

{

        int a[] = {1,2,3,4546,7,3,2,1,89,334};

        int i;

        int len = sizeof(a) / sizeof(a[0]);//数组的长度

        int min, max;

        compare(a,len,&min,&max);

        printf("min=%d,max=%d", min, max);

        return 0;

}

3.二维数组元素的地址

首先要明白的一点就是二维数组其实就是一维数组。在普通的一维数组中(a[0]),用数组名a作为数组a[0]的地址,那么在二维数组中(a[3][4]),a[0],a[1],a[2]就表示数组第一个元素的地址。这个结合一下实例可能比较好理解一下

代码实例

以a[0]作为元素地址

int main()

{

    int a[3][4] = {12,2,3,4,56,7,8,9,10,1,9,34};

    //int n = 5;

    int* p;

    for(p=a[0]; p

    {

        if ((p - a[1]) % 4 == 0)

           printf("\n");

        printf("%d\t", *p);

    }

    return 0;

}

结果:

12      2       3       4

56      7       8       9

10      1       9       34

E:\vs\c++\h\Debug\h.exe (进程 12316)已退出,代码为 0。

按任意键关闭此窗口. . .

若以a[1]作为元素地址

int main()

{

    int a[3][4] = {12,2,3,4,56,7,8,9,10,1,9,34};

    //int n = 5;

    int* p;

    for(p=a[1]; p

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 时分秒毫秒_python将时分秒转换成秒的实例

处理数据的时候遇到一个问题&#xff0c;从数据库里导出的数据是时分秒的格式&#xff1a;hh:mm:ss &#xff0c;现在我需要把它转换成秒&#xff0c;方便计算。原数据可能分两种情况&#xff0c;字段有可能是文本字符串类型的&#xff0c;也有可能是时间类型&#xff0c;他们的…

信息系统项目管理师论文优秀范文_软考 信息系统项目管理师备考指南

1&#xff0e;考试简介信息系统项目管理师考试作为全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;一般简称为“软考”&#xff09;的一个高级级别&#xff0c;是从2005年开始的&#xff0c;一共考了2次&#xff0c;即2005年5月&#xff0c;200…

单片机led闪烁代码_单片机驱动LED发光二极管的电路以及编程

一、单片机驱动单个发光二极管1.电路代码:1.点亮单个LED二极管#include《reg51.h> sbit LED1P1^0&#xff1b;void main(void){LED11&#xff1b;while(1)&#xff1b;{LED10} }2.单个LED数码管以固定频率闪烁#include<reg51.h> sbit LED1P1^0;void Delay(unsigned in…

macos系统自动安装mysql_macos系统安装mysql

MacOS系统安装mysql一、下载官网下载链接地址&#xff1a;https://dev.mysql.com/downloads/mysql/二、安装打开文件是pkg包&#xff0c;双击进行安装&#xff1a;按照提示&#xff1a;点击最下面的MySQL控制按钮&#xff0c;启动数据库运行&#xff1a;在此可以启动和停止MySQ…

水晶报表中对某一栏位值进行处理_合并报表——非同一控制下的企业合并amp;同一控制下的企业合并...

【写在前面】长期股权投资企业的一种投资行为&#xff0c;投资方通过该行为享有被投资单位的股利分配、净利润等投资收益&#xff0c;处理的是母公司&#xff08;投资方&#xff09;的个别财务报表。只有控股合并才需要编制合并报表&#xff0c;意味着后续计量采用的是成本法。…

python测试框架untest怎么循环执行_unittest如何在循环遍历一条用例时生成多个测试结果...

引用自:http://blog.csdn.net/kaku21/article/details/42124593参考网址&#xff1a;http://programmaticallyspeaking.com/test-data-provider-using-python-metaclass.html使用TestNG进行测试的时候&#xff0c;允许使用外部数据源来驱动测试方法的执行&#xff0c;举个例子&…

python杨辉三角_yiduobo的每日leetcode 118.杨辉三角 amp;amp; 119.杨辉三角II

祖传的手艺不想丢了&#xff0c;所以按顺序写一个leetcode的题解。计划每日两题&#xff0c;争取不卡题吧。118.杨辉三角https://leetcode-cn.com/problems/pascals-triangle/119.杨辉三角IIhttps://leetcode-cn.com/problems/pascals-triangle-ii/经典的数学题。118题需要求出…

为什么链接不上mysql数据库_java链接不上数据库,怎么解决!

居正w去年刚好做过这个&#xff0c;给你贴下我的链接代码try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载sqlserver JDBC驱动程序 //Class.forName("org.gjt.mm.mysql.Driver"); System.out.pr…

世界上最难的视觉图_世界上最长的蛇有多长?四川惊现55米洪荒巨蟒(图)

蛇&#xff0c;一直是站在食物链顶端的致命生物&#xff0c;蟒蛇更是能够吞食人类的恐怖巨兽。网传世界上最长的蛇有500米之长&#xff0c;名为“红海巨蛇”&#xff0c;已被证实为虚假传言&#xff0c;以地球现在的环境是不可能出现如此之大的蛇的。据说四川发现了罕见的55米长…

解析器 java_java 常用的解析工具

这里介绍两种 java 解析工具。第一种&#xff1a;java 解析 html 工具 jsoup第二种&#xff1a; java 解析 XML 工具 Dom4jjsoupjsoup是一个用于处理真实HTML的Java库。它提供了一个非常方便的API&#xff0c;用于提取和操作数据&#xff0c;使用最好的DOM&#xff0c;CSS和类似…

php 比java 快_php比java要快在哪里

php比java要快在哪里一些Java可以做的事情php做不了或者说要借助另外的工具才可以做&#xff0c;要但就开发网站这个事情来说&#xff0c;php确实是要比Java效率高&#xff0c;尤其是相对简单的项目。首先&#xff0c;Java的架构要比Php复杂&#xff0c;先不说各种开发框架&…

斯皮尔曼相关系数_惊艳!JASP相关系数矩阵及热力图

今天起我们新增一个案例数据&#xff0c;犯罪数据。这是mei国50个州关于犯罪率的一组数据&#xff0c;包括人口、面积、收入、文盲率、高中毕业率、霜冻天数、犯罪率共7个指标&#xff0c;现在我们想考察一下州犯罪率和其他因素间的关系。数据视图如下&#xff1a;数据取自《R语…

邻接矩阵和邻接表_[力扣743] 带权邻接表的单源最短路

题目链接743. 网络延迟时间 题目描述有 N 个网络节点&#xff0c;标记为 1 到 N。给定一个列表 times&#xff0c;表示信号经过有向边的传递时间。 times[i] (u, v, w)&#xff0c;其中 u 是源节点&#xff0c;v 是目标节点&#xff0c; w 是一个信号从源节点传递到目标节点的…

opencv java ubuntu_Ubuntu 16.04配置OpenCV 3.1.0 for Java

我们都知道&#xff0c;OpenCV是基于C的开源计算机视觉库&#xff0c;但是从2.4.4版本开始提供了Java绑定&#xff0c;也就是说&#xff0c;我们也可以使用Java来开发基于OpenCV的计算机视觉应用。目前&#xff0c;最新的版本是3.1.0&#xff0c;在本文中将会介绍如何中Ubuntu …

service 层 拼接的html 代码如何直接返回_字符串拼接,会走StringBuilder 吗?

前言最近在突然想到了String字符串拼接问题&#xff0c;于是做了一个demo测试了一下&#xff0c;到底String类型的字符串在拼接的时候&#xff0c;哪种情况下会走会走StringBulider进行字符串拼接&#xff0c;而哪种情况编译器会对代码进行优化&#xff1f;话不多说&#xff0c…

迁移学习训练集准确率一直上不去_可以提高你的图像识别模型准确率的7个技巧...

假定&#xff0c;你已经收集了一个数据集&#xff0c;建立了一个神经网络&#xff0c;并训练了您的模型。但是&#xff0c;尽管你投入了数小时(有时是数天)的工作来创建这个模型&#xff0c;它还是能得到50-70%的准确率。这肯定不是你所期望的。下面是一些提高模型性能指标的策…

华为云客户端_华为公布云手机计费清单,要不要光刻机也给出了答案

华为云手机一出来&#xff0c;大家的好奇心就上来了。这就是解决华为无芯片的代替方案。纷纷说道&#xff0c;可以绕开光刻机&#xff0c;光刻机瞬间变废铁。当时我还发布过文章分析&#xff1a;现在的云手机只是一个云端应用&#xff0c;并不是真正的云手机。需要在手机或电脑…

java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形

84. 柱状图中最大的矩形给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。以上是柱状图的示例&#xff0c;其中每个柱子的宽度为 1&#xff0c;给定的高度为…

java中为什么要用注解_java中的注解,真的很重要,你理解了嘛?

这篇文章开始讲解java中的注解&#xff0c;在平时的开发当中我相信你或多或少的接触过注解。比如你可能都见过override&#xff0c;它代表的就是一个注解。但是&#xff0c;为了更加清晰的去介绍注解&#xff0c;我还是先给出一个例子&#xff0c;让你能够方便的理解。一、认识…

qtdesigner右击按钮没有 to slot_或添加“力感按钮”再升级,Apple Pencil会更“能打”?...

&#xff3b;钉科技编译&#xff3d;“I have a pen/I have an apple/Ah apple pen”&#xff0c;钉科技编辑写到的这些“歌词”&#xff0c;看上去是不是很熟悉&#xff1f;对了&#xff0c;这是搞笑艺人Piko Taro那支颇“洗脑”的《PPAP》里的内容。其实&#xff0c;如果说到…