首页 > 其他分享 >C语言进阶版第8课—指针(2)

C语言进阶版第8课—指针(2)

时间:2024-09-07 23:55:02浏览次数:6  
标签:sz arr 进阶 int C语言 地址 数组 printf 指针

文章目录

1. 数组名的理解

  • sizeof(数组名)— 这里的数组名代表整个数组,计算的也是整个数组的大小
  • &数组名 — 这里的数组名代表是整个数组,取出的是整个数组的地址
  • 除了以上两种,其他任何地方使用数组名,数组名都表示首元素的地址
//数组名的理解
#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf(" arr = %p\n", arr);        // arr  ---> 数组首元素地址
	printf("arr[0]=%p\n", &arr[0]);   //&arr[0]---> 数组首元素地址
	printf(" &arr =%p\n", &arr);     //  &arr  ---> 整个数组的地址,不过指向的是数组首元素地址
	printf("--------------------------\n");
	printf(" arr+1 =  %p\n", arr+1);
	printf("&arr[0]+1=%p\n", &arr[0]+1);
	printf(" &arr+1 = %p\n", &arr+1);
	return 0;
}

  arr&arr[0]都是指向数组首元素地址,两者等价,只是不同的写法,而&arr虽然也指向数组首元素地址,但它代表的是整个数组的地址,因此&arr+1代表跳过整个数组的地址,&arr&arr+1应该相差4*10个字节
在这里插入图片描述
在这里插入图片描述

2. 指针访问数组

在这里插入图片描述
在这里插入图片描述

3. 一维数组传参本质

在这里插入图片描述
在这里插入图片描述
  数组传参本质上传递的是数组首元素地址,另外一维数组传参时,形参部分可写成数组形式,大小可忽略不写,也可写成指针形式

#include <stdio.h>
void test(int arr[])      //也可写成void test(int* p)
{
	printf("hehe\n");
}

int main()
{
	int arr[10] = { 0 };
	test(arr);
	return 0;
}

4. 冒泡排序

  • 问题描述:给一组整型数组,对其排序
  • 核心思想:两两相邻元素进行比较

在这里插入图片描述  冒泡排序就是第一个元素与其他九个元素对比,并按照升序或降序的方式进行相应的交换,每趟都能确定待排序的一个元素

//冒泡排序(简易版)
#include <stdio.h>
void bubble_simple(int arr[], int sz)
{
	for (int i = 1; i < sz; i++)
	{
		for (int j = 0; j < sz - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
			printf("第%d趟排序中第%d次对比/交换:", i,j+1);
			for (int n = 0; n < sz - i; n++)
			{
				printf("%d ", arr[n]);
			}
			printf("\n");
		}
		printf("------------------------------------------\n");
		printf("第%d趟排序的结果:",i);
		for (int k = 0; k < sz; k++)
		{
			printf("%d ", arr[k]);
		}
		printf("\n");
		printf("------------------------------------------\n");
	}
}
int main()
{
	int arr[10] = { 9,4,5,7,2,1,3,8,6,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_simple(arr, sz);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

  • 冒泡排序优化代码
  • 有序则跳出
//冒泡排序(优化)
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
	for (int i = 1; i < sz; i++)
	{
		int flag = 1;    //flag用来判断数组是否有序(1代表有序)
		for (int j = 0; j < sz - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;  //发生交换代表无序
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (flag == 1)
			break;         //如果这趟已经有序则跳出循环
		printf("------------------------------------------\n");
		printf("第%d趟排序的结果:", i);
		for (int k = 0; k < sz; k++)
		{
			printf("%d ", arr[k]);
		}
		printf("\n");
		printf("------------------------------------------\n");
	}
}
int main()
{
	int arr[10] = { 9,4,5,7,2,1,3,8,6,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	printf("最终的排序结果>:");
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

在这里插入图片描述

5. 二级指针

  • 二级指针用来存储一级指针变量的地址

在这里插入图片描述

//二级指针
#include <stdio.h>
int main()
{
	int a = 10;
	printf("a的地址>:%p\n", &a);

	int* p = &a;
	printf("a的地址>:%p\n", p);   //p = &a
	printf("p的地址>:%p\n", &p);  
	printf("*p = %d\n", *p);      //*p = a
	
	int* * pp = &p;
	**pp = 20;
	printf("p的地址>:%p\n", pp); //pp = &p
	printf("pp的地址>:%p\n", &pp);
	printf("* *pp = %d\n", **pp); // *pp = p, **pp == *(*pp) == *p == a

	return 0;
}

在这里插入图片描述
在这里插入图片描述

6. 指针数组

  • 存放指针的数组

在这里插入图片描述

7. 指针数组模拟二维数组

  • 在讲解之前,我们先来回忆一下二维数组

在这里插入图片描述
在这里插入图片描述
  arr与&arr[0]都是二维数组首元素地址,则arr+1和&arr[0]+1都是二维数组的第二个元素,跳过4*4=16个字节,图中arr和&arr[0]对应地址后两位B4==11*16+4*1=180,arr+1和&arr[0]+1则对应C4==12*16+4*1=196,两者刚好差16字节

  • 指针数组模拟二维数组
    在这里插入图片描述

标签:sz,arr,进阶,int,C语言,地址,数组,printf,指针
From: https://blog.csdn.net/weixin_70620792/article/details/141907480

相关文章

  • C语言之动态内存管理、柔性数组
    目录前言一、为什么要有动态内存分配二、常用函数(都声明在stdlib.h头文件中)三、常见的动态内存的错误四、柔性数组总结前言    本文讲述C语言动态内存管理的基础知识,另外包括柔性数组的基本知识。❤️感谢支持,点赞关注不迷路❤️一、为什么要有动态......
  • 数据结构--二叉树(C语言实现,超详细!!!)
    文章目录二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码二叉树的概念二叉树(BinaryTree)是数据结构中一种非常重要的树形......
  • C语言程序与设计第四版课后习题 - 1~8章大合集
    前言本文章是一个大合集,按照课后习题的命名方式命名,方便寻找,只需要在目录上点相对应的题号即可在这里插入图片描述第一章课后习题1.1编写一个C程序题目概述:请参照本章例题,编写一个C程序,输出一下信息:*****************************Verygood!*************......
  • C语言操作符详解2(含结构体、整型提升、算术转换)
    文章目录一、逗号表达式二、下标访问操作符[]、函数调用操作符()1.下标访问操作符[]2.函数调用操作符三、结构成员访问操作符1.结构体2.结构的声明3.结构体变量的定义和初始化(1)结构体变量的定义(2)结构体变量的初始化4.结构成员访问符(1)结构成员的直接访问(2)结构成员的间接......
  • 指针(3)的期末复习
    1.字符指针变量在指针的类型中我们知道有⼀种指针类型为字符指针char*代码constchar*pstr="hellobit.";特别容易让同学以为是把字符串到字符指针pstr⾥了,但是本质是把字符串hellobit放hellobit.⾸字符的地址放到了pstr中。 #include<stdio.h>intmain......
  • 贪吃蛇的小游戏--用C语言实现
    贪吃蛇的小游戏–用C语言实现游戏背景贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。实现基本的功能:•贪吃蛇地图绘制•蛇吃⻝物的功能(上、下、左、右⽅向键控制蛇的动作)•蛇撞墙死亡•蛇撞⾃⾝死亡•计算得分•蛇⾝加速、减速•......
  • C语言深度剖析--不定期更新的第四弹
    void关键字void关键字不能用来定义变量,原因是void本身就被编译器解释为空类型,编译器强制地不允许定义变量定义变量的本质是:开辟空间而void作为空类型,理论上不应该开辟空间(针对编译器而言),即使开辟了空间,也只是作为一个占位符看待(针对Linux来说)所以,既然无法开辟空间,也......
  • 【C语言】变量和常量
    文章目录一.变量与常量的概念1.1变量1.2常量1.3变量与常量的比较二.变量2.1变量声明2.2变量初始化2.3命名规范2.4变量作用域2.5使用const限定符三.常量3.1整数常量3.2浮点常量3.3字符常量3.3字符串常量3.4地址常量3.5定义常量一.变量与常量的概念在C语言编程中,理......
  • c语言编译器IDE英汉翻译词典程序代码
    #include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>typedefstruct{charenglish[50];charchinese[50];}WordTranslation;intmain(){intx;intn,g=1;while(g){n=0;WordTranslationtranslations[......
  • 深度学习实战4--GAN进阶与优化
            GAN  的问题主要有两点:Loss 等于0的梯度消失问题和梯度不稳定以及多样性受损。前者是因为选择的分布函数使用JS距离,这个距离不能衡量两个不相交的分布的距离;后者是因为Loss  函数要求KL距离最小,JS 距离最大,所以梯度不稳定,而且 Loss 函数对正确率要......