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

郑州企业网站排行wordpress如何新建页面模板

郑州企业网站排行,wordpress如何新建页面模板,怎么做关于花的网站,手游app开发公司文章目录 【C 语言篇】指针的灵动舞步与内存的神秘疆域#xff1a;于 C 编程世界中领略指针艺术的奇幻华章前言一 、指针的介绍与使用1. 指针的介绍1.1指针表示1.2指针变量1.3空指针 2. 使用指针2.1交换两个变量的值2.2计算输出最小值和最大值 二、野指针的介绍与使用1. 野指针… 文章目录 【C 语言篇】指针的灵动舞步与内存的神秘疆域于 C 编程世界中领略指针艺术的奇幻华章前言一 、指针的介绍与使用1. 指针的介绍1.1指针表示1.2指针变量1.3空指针 2. 使用指针2.1交换两个变量的值2.2计算输出最小值和最大值 二、野指针的介绍与使用1. 野指针的介绍2. 野指针的两种常见情况2.1指向已释放的内存2.2未初始化的指针 3. 野指针带来的问题4. 如何避免野指针 三、指针和数组1. 指针与数组的关系2. 指针和数组的示例3. 指针与数组名[下标]的关系4. 遍历数组 四、指针数组1. 指针数组的定义2. 指针数组的使用 五、数组指针1. 指针数组的定义2. 数组的地址和数组首元素的地址的区别 结语 【C 语言篇】指针的灵动舞步与内存的神秘疆域于 C 编程世界中领略指针艺术的奇幻华章 欢迎交流在学习过程中如果你有任何疑问或想法欢迎在评论区留言我们可以共同探讨学习的内容。你的支持是我持续创作的动力 点赞、收藏与推荐如果你觉得这篇文章对你有所帮助请不要忘记点赞、收藏并分享给更多的小伙伴你们的鼓励是我不断进步的源泉 推广给更多人如果你认为这篇文章对你有帮助欢迎分享给更多对编程感兴趣的朋友让我们一起进步共同提升 前言 指针是 C 语言中强大而精妙的工具其在内存操作与数据处理方面展现出独特的魅力广泛应用于各类复杂的编程场景。本篇中我们将深入且细致地探究指针的基本原理、多样化的类型、灵活多变的运算规则。 本文我们主要来介绍指针: 一 、指针的介绍与使用 1. 指针的介绍 在C语言中指针是一种变量其值为另一个变量的地址。通过指针可以间接访问和操作所指向变量的值它为C语言提供了强大的底层操作能力和灵活的数据处理方式。指针就是保存地址的变量(可以说指针就是地址) 1.1指针表示 int i; int* p i;//(P是一个指针 我们通常会用P表示指针 (point的缩写))这里的星号表示P是一个指针 指向的是int 然后把i的地址交给了p int* p,q; int *p,q;注意了 上面这两行代码是一样的都表示p是一个指针指向int。 而q只是一个int型的变量 int q; 我们并不是把加给了int 而是把星号交给了p所以我们说p是一个int 如果q也要是指针的话那么也需要加* int *p,*q;1.2指针变量 变量的值是内存的地址 普通变量的值是实际的值指针变量的值是具有实际值的变量的地址 作为参数的指针 void f(int *p);在调用时得到某个变量的地址 int i 0;f(i); 在函数里面可以通过这个指针访问外面的这个 #include stdio.h void f(int *p); int main(void) {int i 6;printf(i%p\n,i);f(i);return 0; } void f(int *p) {printf(p%p\n,p); }这里如果输出的话 就是两个地址值 i000000000061FE1C p000000000061FE1C1.3空指针 在变量声明的时候如果没有确切的地址可以赋值为指针变量赋一个 NULL 值是一个良好的编程习惯。 赋为 NULL 值的指针被称为空指针。 NULL 指针是一个定义在标准库中的值为零的常量 #include stdio.h int main (){int *ptr NULL; printf(ptr 的地址是 %p\n, ptr ); return 0; }结果 ptr 的地址是 0x0在大多数的操作系统上程序不允许访问地址为0 的内存因为该内存是操作系统保留的。然而内存地址 0 有特别重要的意义它表明该指针不指向一个可访问的内存位置。但按照惯例如果指针包含空值零值则假定它不指向任何东西。 如需检查一个空指针可以使用 if 语句如下所示 if(ptr) /* 如果 p 非空则完成 */ if(!ptr) /* 如果 p 为空则完成 */2. 使用指针 在运用指针的过程中通常会反复执行以下几个关键步骤首先是创建一个指针变量。接着要把一个普通变量在内存中的地址传递给这个指针让指针“知道”该去哪个位置找数据。而当我们想要获取指针所指向的那个内存地址中存放的具体值时就会用到一元运算符“*”。下面的示例就详细展示了这些操作是如何一步步实现的 *是一个单目运算符用来访问指针的值所表示的地址上的变量可以做右值也可以做左值 int k *p *p k1如果我把星号和指针变量联系在一起后 *p的整体其实都可以被看作是一个整数 #include stdio.h void f(int *p); void g(int k); int main(void) {int i 6;printf(i%p\n,i);f(i);g(i);return 0; } void f(int *p) {printf(p%p\n,p);printf(*p%p\n,*p);*p 26; } void g(int k) {printf(k%d\n,k); }输出结果 i000000000061FE1C p000000000061FE1C *p0000000000000006 k262.1交换两个变量的值 示例代码 #include stdio.h void swap(int *pa,int *pb);int main(void) {int a 5;int b 6;swap(a,b);printf(a%d,b%d\n,a,b);return 0; } void swap(int *pa,int *pb) {int t *pa;*pa *pb;*pb t; }代码结果 a6,b52.2计算输出最小值和最大值 指针的应用场景2 函数返回多个值某些值就只能通过指针返回传入的参数实际上是需要保存带回的结果的变量 #include stdio.h void minmax(int a[],int len,int *max,int *min);int main(void) {int a[] {1,2,3,4,5,6,7,8,9,15};int min,max;minmax(a,sizeof(a)/sizeof(a[0]),min,max);//调用 minmax 函数将数组 a、数组元素的个数通过 sizeof(a)/sizeof(a[0]) 计算得到以及 min 和 max 的地址传递过去以便在函数内修改它们的值printf(min%d,max%d\n,min,max);return 0; } void minmax(int a[],int len,int *min,int *max) {int i;*min *maxa[0];//将数组的第一个元素赋值给 min 和 max初始假定数组的最小值和最大值都是第一个元素。for ( i1;ilen;i){if ( a[i] *min){*min a[i];}if(a[i] *max){*max a[i];}} }输出结果 min1,max15二、野指针的介绍与使用 1. 野指针的介绍 在 C 语言中野指针Dangling Pointer是指一个指针指向一个已经被释放或者没有初始化的内存地址。访问这些内存地址会导致未定义的行为可能导致程序崩溃、内存泄漏或数据损坏。 2. 野指针的两种常见情况 2.1指向已释放的内存 当通过 free() 释放了动态分配的内存后指针仍然持有原来内存的地址但该内存块已不再有效。这时指针变成了野指针。 int* ptr (int*)malloc(sizeof(int)); // 动态分配内存 *ptr 10; // 使用指针 free(ptr); // 释放内存 // ptr 现在是一个野指针2.2未初始化的指针 如果一个指针声明时没有被初始化它的值将是一个随机的地址。这个地址指向的内存可能是无效的或者是程序不应该访问的内存区域。 int* ptr; // 未初始化的指针指向一个未知的地址 *ptr 10; // 访问未初始化的指针会引发未定义行为3. 野指针带来的问题 程序崩溃访问无效的内存地址会导致程序崩溃尤其是在访问已释放的内存时。数据损坏如果野指针指向的是已经被重新分配的内存区域程序通过该指针修改数据可能会损坏原有数据。内存泄漏如果指针指向的内存已被释放但没有将指针置为 NULL程序仍然持有该地址的引用可能会导致无法再次访问该内存块造成内存泄漏。 4. 如何避免野指针 及时将指针置为 NULL 在释放内存后立即将指针赋值为 NULL。这样可以防止后续访问已经释放的内存。 int* ptr (int*)malloc(sizeof(int)); free(ptr); // 释放内存 ptr NULL; // 防止野指针初始化指针 在声明指针时尽量将其初始化为 NULL这样即使没有正确赋值也不会指向一个随机的内存地址。 int* ptr NULL; // 初始化为NULL谨慎使用 free() 每次释放内存后确保不再使用该内存区域。并且只有在内存不再被使用时才调用 free()。 尽量不要使用以下代码 #include stdio.h #include stdlib.hint main() {// 动态分配内存int *ptr (int *)malloc(sizeof(int));if (ptr NULL) {printf(内存分配失败\n);return 1;}// 给指针指向的内存区域赋值*ptr 42;printf(指针指向的值: %d\n, *ptr);// 释放动态分配的内存free(ptr);// ptr 仍然指向之前的内存地址此时 ptr 成为野指针// 此时访问 *ptr 是未定义行为应该避免这样做// printf(指针指向的值: %d\n, *ptr); // 这一行可能导致程序崩溃return 0; }以下是将上述代码示例进行相似替换后的内容展示代码功能逻辑基本一致但可能在具体数值等细节上做了些许变化 三、指针和数组 1. 指针与数组的关系 指针和数组在C语言中有非常紧密的关系主要体现在以下几个方面 数组名与首元素地址在大多数情况下数组名代表的就是数组首元素的地址。例如对于int arr[] { 5, 2, 0 };arr和arr[0]的值是相等的它们都指向数组的第一个元素。这意味着可以使用指针来操作数组元素就好像指针就是数组本身一样。数组的地址和首元素地址的区别虽然数组名大多数情况下表示首元素地址但arr和arr在概念上是有区别的。arr是整个数组的地址而arr是首元素的地址。当对它们进行指针运算时这种区别就会体现出来。例如对于int arr[10];arr 1的值比arr 1的值大sizeof(arr)因为arr 1是跳过了整个数组的地址而arr 1只是跳过了一个元素的地址。 2. 指针和数组的示例 #include stdio.hint main() {int arr[] { 8, 4, 6 };int* pb arr[0];printf(%p\n, arr);printf(%p\n, pb);return 0; }代码结果 000000000061FE0C 000000000061FE0C从上面的结果中我们可以发现 arr是数组名pb是首元素的地址而两者的值相等。 结论数组名大多数情况都是首元素地址。 3. 指针与数组名[下标]的关系 #include stdio.hint main() {int arr[] { 2, 5, 3, 7, 9, 1, 0 };int* pb arr[0];for (int i 0; i 7; i){printf(arr[%d]: %p --- pb %d: %p\n, i, arr[i], i, pb i);}return 0; }代码运行结果 arr[0]: 000000000061FDF0 --- pb 0: 000000000061FDF0 arr[1]: 000000000061FDF4 --- pb 1: 000000000061FDF4 arr[2]: 000000000061FDF8 --- pb 2: 000000000061FDF8 arr[3]: 000000000061FDFC --- pb 3: 000000000061FDFC arr[4]: 000000000061FE00 --- pb 4: 000000000061FE00 arr[5]: 000000000061FE04 --- pb 5: 000000000061FE04 arr[6]: 000000000061FE08 --- pb 6: 000000000061FE08从上面的代码运行结果可以得出指针首元素地址±整数与数组名[下标]是相同的。 4. 遍历数组 下标遍历与指针地址±整数遍历 #include stdio.hint main() {int arr[] { 2, 5, 3, 7, 9, 1, 0 };int* pb arr[0];for (int i 0; i 7; i){printf(arr[%d]: %d --- *(pb %d): %d\n, i, arr[i], i, *(pb i));}return 0; }代码运行结果 arr[0]: 2 --- *(pb 0): 2 arr[1]: 5 --- *(pb 1): 5 arr[2]: 3 --- *(pb 2): 3 arr[3]: 7 --- *(pb 3): 7 arr[4]: 9 --- *(pb 4): 9 arr[5]: 1 --- *(pb 5): 1 arr[6]: 0 --- *(pb 6): 0从上述代码运行情况可以得知下标和指针地址±整数都能够遍历数组。 下标遍历与数组名±整数遍历 #include stdio.hint main() {int arr[] { 2, 5, 3, 7, 9, 1, 0 };int* pb arr[0];for (int i 0; i 7; i){printf(arr[%d]: %d --- *(arr %d): %d\n, i, arr[i], i, *(arr i));}return 0; }从代码运行结果可以得出下标和数组名±整数都可以遍历数组。 数组首元素地址代替数组名遍历 #include stdio.hint main() {int arr[] { 2, 5, 3, 7, 9, 1, 0 };int* pb arr[0];for (int i 0; i 7; i){printf(pb[%d]: %d --- *(pb %d): %d\n, i, pb[i], i, *(pb i));}return 0; }从代码运行表现来看我们可以得出数组首元素地址可以代替数组名。 结论 指针首元素地址±整数与数组名[下标]是相同的。下标和指针首元素地址±整数都能够遍历数组。下标和数组名±整数都可以遍历数组。数组首元素地址可以代替数组名。arr[i] *(arr i) *(pb i) pb[i] 四、指针数组 1. 指针数组的定义 指针数组是一种存储指针的数组。 #include stdio.hint main() {int arr1[] { 3, 6, 2, 2, 4, 2, 5 };int arr2[] { 3, 6, 1, 2, 4, 2, 5 };int arr3[] { 7, 5, 3, 1, 1, 1, 1 };int* pArr[] { arr1, arr2, arr3 };int i 0;for (i 0; i 3; i){printf(%p\n, pArr[i]);}return 0; }代码运行结果 000000000061FE00 000000000061FDE0 000000000061FDC02. 指针数组的使用 指针数组是存储一级指针的数组而一级指针指向的是数组其使用与二维数组有些相似但二者并不能完全等同看待。 #include stdio.hint main() {int arr1[] { 3, 6, 2, 2, 4, 2, 5 };int arr2[] { 3, 6, 1, 2, 4, 2, 5 };int arr3[] { 7, 5, 3, 1, 1, 1, 1 };int* pArr[] { arr1, arr2, arr3 };int i 0;for (i 0; i 3; i){for (int j 0; j 7; j){printf(%d , pArr[i][j]);}printf(\n);}return 0; }代码运行结果 3 6 2 2 4 2 5 3 6 1 2 4 2 5 7 5 3 1 1 1 1五、数组指针 1. 指针数组的定义 数组指针是用来存放数组地址的指针。 数组指针变量如何定义假设这里的指针变量是q数组存放的int类型的变量 首先它是指针那么就不能与[ ]先结合 ---- *q其次它指向的内容是数组 ---- (*q)[ ] ----[ ]中为数组的元素个数最后它指向数组存储变量的类型是什么 ---- int(*q)[ ] #include stdio.hint main() {int arr[8] { 1, 2, 3, 4, 5, 6, 7, 8 };int(*q)[8] arr;printf(%p, q);return 0; }2. 数组的地址和数组首元素的地址的区别 区别arr与arr 取出数组的地址和数组首元素的地址有什么区别 #include stdio.hint main() {int arr[8] { 1, 2, 3, 4, 5, 6, 7, 8 };printf(%p\n, arr); //打印数组的地址printf(%p\n, arr); //打印数组首元素的地址printf(%p\n, arr[0]); //打印数组首元素的地址return 0; }这里取出数组的地址和数组首元素的地址看起来好像没什么区别 让它们取出来的地址1试试。 #include stdio.hint main() {int arr[8] { 1, 2, 3, 4, 5, 6, 7, 8 }; // 定义并初始化一个包含8个整数的数组printf(%p\n, arr); // 打印整个数组的地址类型为 int (*)[8]printf(%p\n, arr); // 打印数组首元素的地址类型为 int *printf(%p\n, arr[0]); // 打印数组首元素的地址与上面的结果相同printf(\n);printf(%p\n, arr 1); // 打印整个数组的地址加1跳过整个数组的大小8个int指向下一个内存块printf(%p\n, arr 1); // 打印数组首元素的地址加1指向第二个元素 arr[1] 的地址printf(%p\n, arr[0] 1); // 打印数组首元素的地址加1指向第二个元素 arr[1] 的地址与上面的结果相同return 0; } 代码运行结果 000000000061FE00 000000000061FE00 000000000061FE00000000000061FE20 000000000061FE04 000000000061FE04上文总结 arr 和 arr 在打印时地址看似相同但在进行算术运算时产生的结果是不同的。 arr 1 指向的是整个数组后的地址而 arr 1 和 arr[0] 1 都是指向第二个元素 arr[1] 的地址。 结语 在 C 语言中指针、指针数组和数组指针有着不同的特质与用途以下是我对这三者的总结帮助理解它们之间的区别、联系以及如何有效地使用它们。 指针能够直接操控内存地址借此间接访问和修改数据可在函数间传递地址以避免大量数据复制提升效率同时为动态内存分配提供支持。指针数组用于集中存储多个同类型数据对象的地址便于统一管理与操作能节省内存空间并提高处理效率。数组指针 **专门指向数组便于对二维或多维数组进行高效操作与访问简化多维数组元素的处理逻辑。那么我想以上这就是【C 语言指针篇】指针的灵动舞步与内存的神秘疆域于 C 编程世界中领略指针艺术的奇幻华章的内容了通过对指针、指针数组和数组指针的学习使我们可以在编程中更好的解决问题。❤️ 意气风发漫卷疏狂 学习是成长的阶梯每一次的积累都将成为未来的助力。我希望通过持续的学习不断汲取新知识来改变自己的命运并将成长的过程记录在我的博客中。 如果我的博客能给您带来启发如果您喜欢我的博客内容请不吝点赞、评论和收藏也欢迎您关注我的博客。 您的支持是我前行的动力。听说点赞会增加自己的运气希望您每一天都能充满活力 愿您每一天都快乐也欢迎您常来我的博客。我叫意疏希望我们一起成长共同进步。 我是意疏 下次见
http://www.dnsts.com.cn/news/115541.html

相关文章:

  • 湖南网站seo推广dedecms学校网站模板
  • 百度免费网站制作深圳做营销网站制作
  • 网片围栏最新黑帽seo培训
  • 书店网站建设有域名如何做网站
  • 做青蛙网站城乡住建局官网
  • wordpress获取站点标题网站开发和运行 法律
  • wix做网站步骤番禺区营销型网站建设
  • 做的好的h游戏下载网站有哪些网站解析后几天可以访问
  • 网站建设需要用到的软件行业门户型网站制作
  • 弄个做网站公司网站推广行业赚钱吗
  • 网站开发 定制 合同 模板玛沁县wap网站建设公司
  • 有没有专门做蛋糕的网站中国效能建设网站
  • 布局网站开发网站logo怎么做动态
  • 阿里云网站建设基本流程做零售去哪个外贸网站
  • 海口模板建站定制1688官网网页版
  • 企业建站系统模板深圳产品网络推广
  • 让蜘蛛不抓取网站的文件夹WordPress 微信采集助手
  • 西安市建网站找哪家wordpress 3.2 漏洞
  • 交易网站建设需要学什么软件最好建设网站
  • 免费网站制作范例网站建设 中企动力宜昌
  • 厦门市建设与管理局网站小7手游官网下载
  • 做蛋糕的网站大庆网页制作公司价格
  • 手机网站建设宣传好微信小程序建设公司
  • 企业网站seo平台孝义做网站
  • 网络编辑的网站建设题网站建设北京海淀
  • 郑州正云网站建设如何做免费的网站推广
  • 青岛正规公司网站建设公司本地网站做不大
  • 杭州哪里找网站建设的兼职哪里有网站建设加工
  • 汕头网站建设推广河南旅游网站建设
  • 网站建设品牌策划方案应价交易系统网站开发