指针基础知识点合集2(基础入门到深入理解)

知识特点(学习方向)

上一篇是最基础概念,这一篇将涉及  如何⽤指针访问数组,⼀维数组传参,冒泡排序,⼆级指针, 指针数组, 指针数组模拟⼆维数组等更深入的一些知识点,每篇内容不多很好理解,相信大家看完这几篇之后会对指针的理解有质的飞跃

深入理解未来会继续连更4篇,如果需要可以先关注。

每一个知识点都讲的很细节,已经学明白并掌握第一节指针基础知识点合集1的同学让我们一起继续深一步的学习。

运用类比,希望大家能和前面知识点联系起来,多比较,多研究,祝大家学习愉快。

1.数组名的理解(比赛题常考点)

数组是什么,数组名就是首元素地址嘛??(你和数组心连心,数组对你伤脑筋)

先自己检测一下能否分清以下数组含义吧!

sizeof(arr)
printf("&arr[0] = %p\n", &arr[0]);
 printf("arr = %p\n", arr);
 printf("arr[1] = %p\n", arr[1]);
arr[1];

其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:

sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩, 单位是字节。

&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素 的地址是有区别的)

除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址

1.1区分arr和&arr

#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;
}

结果如下:

解释:我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1相差4个字节,是因为&arr[0]和arr都是 ⾸元素的地址,+1就是跳过⼀个元素.但是&arr和&arr+1相差40个字节,这就是因为&arr是数组的地址,+1操作是跳过整个数组.

2.使⽤指针访问数组

前面介绍过指针基础概念后,这一篇我们主要讲基础运用。

举例:

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//需要数组长度因此需要先计算出元素个数
	int* p = arr;//数组名等于首元素地址!!!
	for (i = 0; i < sz; i++)
	{
		scanf_s("%d", p + i);
	} 
	for (i = 0; i < sz; i++)
	{
		printf("%d", *(p + i));
	}
	return 0;
}

 将*(p+i)换成p[i]也是能够正常打印的,本质上p[i]是等价于*(p+i)

3.⼀维数组传参的本质

数组名是数组⾸元素的地址;那么在数组传参 的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址

void test(int arr[])//参数写成数组形式,本质上还是指针 ,数组名是首元素地址,依然是指针
{
 printf("%d\n", sizeof(arr));
}

void test(int* arr)//参数写成指针形式 
{
 printf("%d\n", sizeof(arr));//计算⼀个指针变量的⼤⼩ 
}

int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 test(arr);
 return 0;
}

⼀维数组传参,形参的部分可以写成数组,也可以写成指针的形式。

4.⼆级指针

指针变量也是变量

是变量就有地址,那指针变量的地址存放在哪⾥? 这就是 ⼆级指针(一级指针变量的地址

举例子:

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a

**ppa = 30;

//等价于*pa = 30; 

//等价于a = 30; 

5.指针数组

整型数组,是存放整型的数组,字符数组是存放字符的数组

指针数组呢?是存放指针的数组

指针数组的每个元素是地址,⼜可以指向⼀块区域

指针数组的每个元素都是⽤来存放地址(指针)的

6.指针数组模拟⼆维数组

(二维数组实际上就是多个一维数组构成的数组

#include <stdio.h>

int main()
{
 int arr1[] = {1,2,3,4,5};
 int arr2[] = {2,3,4,5,6};
 int arr3[] = {3,4,5,6,7};
 //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中 
 int* parr[3] = {arr1, arr2, arr3};
 int i = 0;
 int j = 0;
 for(i=0; i<3; i++)
 {
 for(j=0; j<5; j++)
 {
 printf("%d ", parr[i][j]);
 }
 printf("\n");
 }
 return 0;
}

7.冒泡排序(十分详细重要排序算法题,后期排序算法也会出合集))

7.1冒泡排序的思想

两两相邻元素比较,按照降序或者升序,如果不满足顺序就交换,满足顺序就找下一对儿

例如上图

1.若有n个元素,最坏的情况需要进行n-1趟冒泡排序:说明需要元素个数

2.每一对儿都需要相互比较

7.2冒泡排序实现过程(解析看不懂后台私信或评论都可以 随时解答)

1.首先定义题中已给数据(例如数组)

2.因为我们需要确定排序多少趟,怎么循环,所以需要计算一下数组元素个数int sz = sizeof(arr) / sizeof(arr[0]);

3.以上为准备工作,那么实现冒泡时我们可以分装一个函数bubble_sort(arr,sz)(数组和元素个数传过去

4.冒泡排序中,需要用循环for来表示循环排序过程(for (i = 0; i < sz - 1; i++))(我们已经分析,若有n个元素,最坏的情况需要进行n-1趟冒泡排序)进入每趟循环后,例如第一趟循环,第一个元素需要跟每一个元素比较那么这个比较也需要循环因此我们还需要一层循环

5.第二层循环中需要和每个元素比较大小for (j = 0; j <sz-1-i; j++)(例如第一趟是10个元素,需要进行8次相互比较(例如:9 8 7 6 5 4 3 2 1 0,那么9和8比,9和7比.......等等等等),所以就需要使用if来进行判断if (arr[j] > arr[j + 1])。

6.实现完冒泡排序之后需要输出,可以再封装一个函数,根据for循环依次进行输出打印(这个不懂的话是for循环的知识点)

//对一个数组中的元素实现升序的冒泡排序
void bubble_sort(int arr[],int sz)//不需要任何返回值,只用排序就行
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)//循环趟
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j <sz-1-i; j++)
		{
			if (arr[j] > arr[j + 1])//判断是否满足升序
			{//不满足就交换
				int tmp = arr[j];//注意定义中间变量 
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	printf("\n");

}

#include<stdio.h>
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);//封装进入一个函数内
	print_arr(arr, sz);//封装一个函数进行打印
	return 0;
}

指针形式:

//对一个数组中的元素实现升序的冒泡排序
void bubble_sort(int *arr,int sz)//不需要任何返回值,只用排序就行
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)//循环趟
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j <sz-1-i; j++)
		{
			if (*(arr+j) > arr[j + 1])//判断是否满足升序
			{//不满足就交换
				int tmp = *(arr + j);//注意定义中间变量 
				*(arr + j) = *(arr+j + 1);
				*(arr+j + 1) = tmp;
			}
		}
	}
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	printf("\n");

}

#include<stdio.h>
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);//封装进入一个函数内
	print_arr(arr, sz);//封装一个函数进行打印
	return 0;
}

7.3优化代码

以上方式即使一开始就,因此我们可以先假设元素本身就是有序的,如果不满足

再进行排列

1.加入flag通过flag避免那种本身就符合顺序的元素

2.加入count来检验看程序是否这样更加优化

//对一个数组中的元素实现升序的冒泡排序
int count = 0;//可以看排序了几趟,这样可以比较优化效果
void bubble_sort(int arr[], int sz)//不需要任何返回值,只用排序就行
{
	int i = 0;

	for (i = 0; i < sz - 1; i++)//循环趟
	{
		int flag = 1;//假设有序
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			count++;// 进行比较就++
			if (arr[j] > arr[j + 1])//判断是否满足升序
			{//不满足就交换
				int tmp = arr[j];//注意定义中间变量 
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;//有交换就为0;
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	printf("\n");

}

#include<stdio.h>
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);//封装进入一个函数内
	print_arr(arr, sz);//封装一个函数进行打印
	printf("count=%d", count);
	return 0;
}  

优化后与先前对比图:

完—

今天的分享就先到这里,每篇涉及的知识点不是很多但都十分相信,希望对大家有所帮助,有什么问题或者指教都可以提出来哈,记得点赞关注哦!

小预告(明日老时间分享):

1.字符指针变量

2. 数组指针变量

3. ⼆维数组传参的本质

4. 函数指针变量

5. 函数指针数组

6. 转移表

7.assert断言

等内容

祝大家工作顺利,学业有成!!!

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: C语言基础知识入门PDF是一份C语言的教学材料,适初学者学习和掌握C语言的基本语法、语义和编程方法。 C语言是一种高效、灵活、可移植、可扩展的编程语言,被广泛应用于操作系统、数据库系统、嵌入式系统等领域。学习C语言,需要掌握计算机基本原理、编程思想和算法设计等知识,而C语言基础知识入门PDF提供了一种快速入门、易于理解的学习途径。 C语言基础知识入门PDF包括了C语言的基本数据类型、运算符、流程控制语句、函数、指针、数组、结构体等内容,通过实例演示和练习题目的方式,帮助学生深入理解C语言的编程思想和技巧。 此外,C语言基础知识入门PDF还介绍了一些常用的C语言开发工具,如编辑器、编译器和调试器等,帮助学习者掌握基本的开发环境和技巧。 总之,C语言基础知识入门PDF是一本很好的C语言入门教材,通过细致详尽的篇章结构、浅显易懂的代码示范和解释,对于初学者学习C语言或复习C语言基础知识来说,都是一份很好的参考资料。 ### 回答2: 《C语言基础知识入门》是一本适初学者入门的C语言教材,它由浅入深地介绍了C语言的基本语法、数据类型、控制结构、函数以及指针等内容。这本教材所包含的知识点非常基础和易懂,对于初学者来说非常友好,能够循序渐进地帮助他们逐步掌握C语言的基本概念和基础知识。 在学习过程中,这本教材还特别注重实践,提供了大量的实例代码以及习题和答案,帮助学生巩固所学知识,培养编程思维,提高编程能力。此外,这本教材还介绍了一些C语言的衍生语言和标准库,让学生在了解基础知识的同时,对C语言的发展和应用方向也有所了解。 总之,对于初学者来说,《C语言基础知识入门》是一本非常好的入门教材,它简单易懂、注重实践、知识面广泛、涵盖了C语言的基本知识点和实际应用场景,推荐给所有对于C语言感兴趣的初学者。 ### 回答3: 《C语言基础知识入门PDF》是一本适初学者的C语言教程,它详细介绍了C语言的各个方面。该教程涵盖了C语言的基本语法、数据类型、运算符、流程控制、函数、指针、结构体、文件操作等重要内容。通过学习这本教程,初学者可以逐步掌握C语言的基础知识,轻松理解编程思路。 该教程首先讲解了C语言的数据类型,包括整型、浮点型、字符型等,以及变量的定义和命名方法。接着介绍了运算符的使用方法,包括算术运算符、关系运算符和逻辑运算符。 在掌握了基础语法之后,该教程讲解了流程控制语句,如if语句、switch语句和循环语句等。这些语句非常重要,可以让程序根据不同的情况执行不同的操作。 接着,该教程介绍了函数的定义和调用方法。函数可以让程序模块化,使代码更具可读性。同时,它还讲解了指针的概念和使用方法,指针可以让程序更加灵活。 最后,该教程讲解了文件操作。文件是计算机存储数据的重要方式,学会文件操作可以让程序更好地处理数据。 总的来说,《C语言基础知识入门PDF》适没有任何编程基础的初学者阅读。通过阅读该教程,初学者可以了解C语言的基本语法和编程思想,为以后深入学习打下基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值