当前位置: 首页 > news >正文

第一代网站建设技术免费个人网站空间

第一代网站建设技术,免费个人网站空间,用wordpress做视频网站,软件测试线上培训C语言指针详解-包过系列(二)目录版 1、数组名的深入理解1.1、数组名的本质1.2、数组名本质的两个例外1.2.1、sizeof(数组名)1.2.2、&数组名 2、使用指针访问数组3、一维数组传参本质4、二级指针4.1、二级指针介绍4.2、二级指针…

C语言指针详解-包过系列(二)目录版

    • 1、数组名的深入理解
      • 1.1、数组名的本质
      • 1.2、数组名本质的两个例外
        • 1.2.1、sizeof(数组名)
        • 1.2.2、&数组名
    • 2、使用指针访问数组
    • 3、一维数组传参本质
    • 4、二级指针
      • 4.1、二级指针介绍
      • 4.2、二级指针运算
    • 5、指针数组(模拟实现二维数组)

1、数组名的深入理解

1.1、数组名的本质

数组名的本质其实就是数组首元素的地址。我们以下面的代码测试为例:

#include<stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};printf("&arr[0] = %p\n ", &arr[0]);//取数组首元素地址printf("arr     = %p\n ", arr);//取数组数组名return 0;
}

在这里插入图片描述
可见二者一模一样,故验证了数组名即为数组首元素地址。
但是可能会有读者提出以下质疑:

#include<stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};printf("%d", sizeof(arr));return 0;
}

在这里插入图片描述
若数组名 arr 表示的是数组首元素的地址的话,那么输出结果应当为一个地址的大小,也就是4/8字节。这就涉及到了数组名是数组首元素地址的两个例外了,请见 1.2

1.2、数组名本质的两个例外

1.2.1、sizeof(数组名)

在关键字 sizeof 中单独放入数组名时,这个数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。如上 1.1 中所示。
注意:只有是单独放入数组名时,数组名才表示整个数组,其余情况下均是计算数据类型大小。
如下面代码所示:

#include<stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};printf("%d", sizeof(arr + 1));//此时 arr 就又恢复成数组首元素的地址了return 0;
}

在 x86 环境下的运行结果:
在这里插入图片描述
在 x64 环境下的运行结果:
在这里插入图片描述
如上所示,当sizeof内部非单独放置数组名时,sizeof 计算的就是对应运行环境的地址的大小。

1.2.2、&数组名

&数组名 ,这里的数组名表示的是整个数组,取出的是整个数组的地址(注意:整个数组的地址与数组首元素地址是有区别的)
我们通过下面代码的演示使大家对此有更加清晰的认识。

#include<stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};printf("&arr[0] = %p\n", &arr[0]);printf("arr     = %p\n",  arr   );printf("&arr    = %p\n", &arr   );return 0;
}

在这里插入图片描述
我们发现三个输出结果完全一样。不急,我们通过对地址进行加减整数运算来使他们原形毕露。演示如下:

#include<stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};printf("&arr[0] = %p\n", &arr[0]);printf("&arr[0] + 1 = %p\n", &arr[0] + 1);printf("arr     = %p\n",  arr   );printf("arr + 1 = %p\n", arr + 1);printf("&arr     = %p\n", &arr);printf("&arr + 1 = %p\n", &arr + 1);return 0;
}

在这里插入图片描述
通过上述演示我们发现,在 x86 环境下,&arr[0] 和 &arr[0] + 1 之间相差4字节,arr 与 arr + 1 也是相差4字节。这是因为二者均表示首元素的地址, + 1 也就是跳过一个元素。
但是 &arr 和 &arr + 1 则相差40个字节,这就是因为 &arr 表示的是整个数组的地址,+ 1 操作是跳过整个数组的。

2、使用指针访问数组

由上文我们可知数组名表示数组首元素的地址,那么数组名加整数就可以访问首元素后面的元素。
请看下面代码:

#include<stdio.h>
int main()
{int arr[10] = { 0 };int i = 0;size_t sz = sizeof(arr) / sizeof(arr[0]);int* parr = arr;//将数组首元素地址存储到指针 parr 中//输入for (i = 0; i < sz; i++){scanf("%d", parr + i);//遍历数组地址//注意,这里parr+i就已经表示数组对应下标元素的地址了,&parr+i表示的就是指针变量parr的地址加减整数了。//scanf("%d", arr + i);也可以这样写}//输出for (i = 0; i < sz; i++){printf("parr[%d] = %d\n", i, *(parr + i));//输出数组元素}return 0;
}

在这里插入图片描述
在这里我们补充一点数组 arr[ i ] 在编译前系统会将其转化为 *(arr + i) 然后再进行编译。
在这里插入图片描述
由上所述,我们进一步分析,数组名 arr 是首元素地址,可以赋值给 parr ,其实数组名 arr 和 parr 在这里是等价的。既然我们可以使用 arr[i] 访问数组,那 parr[i]也应该能访问数组。如下演示:

#include<stdio.h>
int main()
{int arr[10] = { 0 };int i = 0;size_t sz = sizeof(arr) / sizeof(arr[0]);int* parr = arr;//将数组首元素地址存储到指针 parr 中//输入for (i = 0; i < sz; i++){scanf("%d", parr + i);}//输出for (i = 0; i < sz; i++){printf("parr[%d] = %d\n", i, parr[i]);//等价于arr[i]}return 0;
}

综上,我们可以总结出以下四点:
1、数组就是数组,是一块连续的空间(与数组大小,数组元素个数,数组元素类型都有关系)
2、指针变量就是指针变量,是一个变量(4/8bytes)
3、数组名除两个特例外,表示的都是数组首元素的地址
4、可以使用指针来访问数组,数组在系统编译时转化的内容就是指针。

3、一维数组传参本质

在之前函数章节,我们已经讲过数组可以作为参数传递给函数,在本节我们讲述一下数组传参本质。
我们先用一个问题来作引,我们之前在函数外部计算过数组元素的个数,在本节我们不妨尝试在函数内部计算求数组元素个数。

#include<stdio.h>void test(int arr[])
{size_t sz2 = sizeof(arr) / sizeof(arr[0]);printf("sz2 = %d\n", sz2);
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };size_t sz1 = sizeof(arr) / sizeof(arr[0]);printf("sz1 = %d\n", sz1);test(arr);return 0;
}

在 x86 环境下的结果:
在这里插入图片描述
我们可见 sz2 的值并不等于 sz1 。这就涉及到数组传参的本质了。数组传参的时候传递的是数组名,也就是数组首元素的地址。
所以函数形参部分理论上应当使用指针来接收数组首元素地址。故在函数内部我们所写的sizeof(arr)计算的其实是地址的大小在 x86 环境下就是4字节。sizeof(arr[0])计算的是数组首元素的大小即int类型,大小为4字节。故 sz2 的结果为1.
补充:在x64环境下的运行结果:
在这里插入图片描述

sizeof(arr)/sizeof(arr[0]) == 8/4 == 2

在 x64 环境下地址的大小为8字节。

#include<stdio.h>void test(int* arr)
{printf("%d\n", sizeof(arr));//计算一个指针变量的大小
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };size_t sz1 = sizeof(arr) / sizeof(arr[0]);//计算数组内元素个数多少。printf("sz1 = %d\n", sz1);test(arr);return 0;
}

综上所述,我们总结出以下两点:
1、数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参的数组是同一个数组。故在形参数组中更改数组内容也会更改实参数组中的内容(传址调用由此区别于传值调用)。
2、形参的数组是不会再单独创建空间,所以形参的数组是可以省略数组大小的。

4、二级指针

4.1、二级指针介绍

指针变量也是变量,是变量就有地址,那指针变量的地址存放于何处?这就涉及到二级指针。

#include<stdio.h>
int main()
{int a = 0;int* p = &a;//一级指针p存储a的地址int** pp = &p;//二级指针存储p的地址printf("p = %p\n", p);printf("pp = %p\n", pp);return 0;
}

在这里插入图片描述

4.2、二级指针运算

1、*pp 通过对 pp 中地址的解引用,如此找到 p ,*pp访问的就是 p

#include<stdio.h>
int main()
{int a = 0;int b = 10;int* p = &a;//一级指针p存储a的地址int** pp = &p;//二级指针存储p的地址*pp = &b;//通过解引用更改一级指针 p 所指向的对象printf("%d", *p);return 0;
}

在这里插入图片描述
2、**pp 先通过*pp 找到 p 然后再通过对 p 解引用找到 a。

#include<stdio.h>
int main()
{int a = 0;int* p = &a;//一级指针p存储a的地址int** pp = &p;//二级指针存储p的地址**pp = 20;//通过两次解引用更改一级指针 p 所指向的对象的内容。//等价于*p =20//等价于 a = 20printf("%d", a);return 0;
}

在这里插入图片描述

5、指针数组(模拟实现二维数组)

我们知道有整型数组,字符型数组,浮点型数组等,由此可知指针数组就是存储的元素是指针的数组。指针数组的每个元素又指向一块区域。
我们用指针数组模拟二维数组为例:
首先先编写好3个一维数组:

#include<stdio.h>
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 6,7,8,9,10 };int arr3[] = { 11,12,13,14,15 };return 0;
}

然后来设置指针数组,让指针数组内存储一维数组的地址,由上文知就是数组名。

#include<stdio.h>
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 6,7,8,9,10 };int arr3[] = { 11,12,13,14,15 };int* arr[] = { arr1 , arr2 , arr3 };//编写指针数组int i = 0;for (i = 0; i < 3; i++)//打印模拟的二维数组{int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

在这里插入图片描述
在这里插入图片描述
上述代码只是模拟出了二维数组的效果,但并不是完全等于二维数组,因为上面模拟出的数组的每一行并不是连续的。

全文至此结束!!!
写作不易,不知各位老板能否给个一键三连或是一个免费的赞呢(-▽-)(-▽-),这将是对我最大的肯定与支持!!!谢谢!!!(-▽-)(-▽-)


文章转载自:
http://outdated.jnpq.cn
http://satiric.jnpq.cn
http://friability.jnpq.cn
http://cottonize.jnpq.cn
http://allure.jnpq.cn
http://prosodical.jnpq.cn
http://ratify.jnpq.cn
http://juso.jnpq.cn
http://narcissism.jnpq.cn
http://nominally.jnpq.cn
http://revocative.jnpq.cn
http://metathoracic.jnpq.cn
http://reciprocity.jnpq.cn
http://thesis.jnpq.cn
http://advert.jnpq.cn
http://dorm.jnpq.cn
http://entozoic.jnpq.cn
http://oxyhydrogen.jnpq.cn
http://limpid.jnpq.cn
http://sincerity.jnpq.cn
http://sinister.jnpq.cn
http://herring.jnpq.cn
http://supramundane.jnpq.cn
http://asafetida.jnpq.cn
http://illiberal.jnpq.cn
http://cytopathic.jnpq.cn
http://novelle.jnpq.cn
http://teledu.jnpq.cn
http://menotaxis.jnpq.cn
http://magnetotail.jnpq.cn
http://buhr.jnpq.cn
http://staging.jnpq.cn
http://ennyyee.jnpq.cn
http://retroactively.jnpq.cn
http://whortle.jnpq.cn
http://didymous.jnpq.cn
http://cered.jnpq.cn
http://cloop.jnpq.cn
http://phosphorous.jnpq.cn
http://lycine.jnpq.cn
http://golfer.jnpq.cn
http://furlough.jnpq.cn
http://algebraic.jnpq.cn
http://interview.jnpq.cn
http://cromerian.jnpq.cn
http://antithrombotic.jnpq.cn
http://rapist.jnpq.cn
http://serpent.jnpq.cn
http://worse.jnpq.cn
http://descendible.jnpq.cn
http://rumen.jnpq.cn
http://endleaf.jnpq.cn
http://curriculum.jnpq.cn
http://protocol.jnpq.cn
http://mossycup.jnpq.cn
http://tipnet.jnpq.cn
http://supersalt.jnpq.cn
http://meateater.jnpq.cn
http://astrochronology.jnpq.cn
http://roughly.jnpq.cn
http://commute.jnpq.cn
http://impenitence.jnpq.cn
http://stagnancy.jnpq.cn
http://norm.jnpq.cn
http://thermophysical.jnpq.cn
http://unicode.jnpq.cn
http://sepoy.jnpq.cn
http://inh.jnpq.cn
http://foglight.jnpq.cn
http://fruitery.jnpq.cn
http://psychosomimetic.jnpq.cn
http://wedgie.jnpq.cn
http://committee.jnpq.cn
http://drooly.jnpq.cn
http://frown.jnpq.cn
http://fluor.jnpq.cn
http://substruction.jnpq.cn
http://apocarpous.jnpq.cn
http://whipping.jnpq.cn
http://pucklike.jnpq.cn
http://embosk.jnpq.cn
http://amebic.jnpq.cn
http://aftermarket.jnpq.cn
http://rang.jnpq.cn
http://swanu.jnpq.cn
http://cholelith.jnpq.cn
http://undecorated.jnpq.cn
http://coastways.jnpq.cn
http://decompound.jnpq.cn
http://rebel.jnpq.cn
http://subcool.jnpq.cn
http://townee.jnpq.cn
http://illuminaten.jnpq.cn
http://coracle.jnpq.cn
http://distinctive.jnpq.cn
http://wherethrough.jnpq.cn
http://bingy.jnpq.cn
http://sulfhydryl.jnpq.cn
http://leviticus.jnpq.cn
http://depart.jnpq.cn
http://www.hrbkazy.com/news/63973.html

相关文章:

  • 怎么做无损mp3下载网站免费正规大数据查询平台
  • 自定义投票网站怎么做北京seo结算
  • 网站建设这个百度推广一个月多少钱
  • 网易工作做网站工资奖金高吗jmr119色带
  • 广东做网站公司搜索引擎整合营销
  • 网站制作软件教程企业培训课程
  • 柳州做网站的企业东莞今天最新消息新闻
  • 有什么网站可以做电台网络公司seo教程
  • 合肥网站运营管理公司电商培训机构排名
  • window2008 网站建设青岛网站seo服务
  • 网页设计图片里面怎么包含文字疫情二十条优化措施
  • 完美建设工程有限公司网站百度一下就知道官网
  • 网站怎样做谷歌推广seo如何提高排名
  • 做鸭服务的网站或群自媒体是什么
  • 网站上线怎么做登封网络推广公司
  • 长沙网站建设哪个好产品推广方案范例
  • 怎么看网站是不是php语言做的百度搜索入口网址
  • wordpress iis 404seo外包公司兴田德润
  • 青岛哪家公司做网站好360优化大师下载
  • 广东如何做网站设计免费发布信息不收费的网站
  • 广州黄埔做网站网站域名综合查询
  • 好看的网站的导航怎么做seo建站平台哪家好
  • 可以做照片书的网站it培训机构
  • 网站开发软件dw关键词优化上海
  • 重庆手机网站建设公司快速提升排名seo
  • 网站建设创新企业网站优化工具
  • 网站开发工具大全大连seo网站推广
  • 怎么增加网站收录搜索指数查询平台
  • 百度首页网站推广多少钱一年模板建站代理
  • 长沙做网站有哪些互联网电商平台有哪些