C语言初阶———指针(3)

5.使用指针访问数组

#include<stdio.h>

int main(void)
{
	int arr[10] = { 0 };
	//使用指针来访问数组
	int sz = sizeof(arr) / sizeof(arr[0]);
	//输入十个值
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		//输入一个值
		scanf("%d\n", p + i);	//p+i == &arr[i]
	}
	//输入10个值
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

 1.数组就是数组,是一块连续的空间(数组的大小和数组元素个数和元素类型都有关系);

 2.指针(变量)就是指针(变量),是一个变量(4/8个字节);

 3.数组名是地址,是首元素的地址;

 4.可是使用指针来访问数组。

*(p+i) == p[i] == * (arr + i)  ==  arr[i] == * (i+arr) == i [arr]   !!!

6.一维数组传参的本质

我们之前都是在函数外部计算数组的元素个数,那我们可以把数组传给一个函数后,函数内部求数组元素个数吗?

#include<stdio.h>

void Print(int arr[10], int sz)
{
	int i = 0;
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);//1,2,3,4,5,6,7,8,9,10
	}
}
int main(void)
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Print(arr, sz);	//数组名就是数组首元素地址
	return 0;
}

这里如果把计算数组元素个数的sz放在函数调用中,打印出来的就不是1~10的元素了,具体原因看以下代码:

#include<stdio.h>
void Print(int* p, int sz)	//应该是指针
{
	int i = 0;
	for ( i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));//1,2,3,4,5,6,7,8,9,10
	}
}
int main(void)
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Print(arr,sz);	//数组名就是数组首元素地址
	return 0;
}
#include<stdio.h>

void test1(int arr[])//参数写成数组形式,本质上还是指针
{
	printf("%d\n", sizeof(arr));	//8
}
void test2(int* arr)//参数写成指针形式
{
	printf("%d\n", sizeof(arr));//   8   计算一个指针变量的大小
}
int main(void)
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	test1(arr);
	test2(arr);
	return 0;
}

 7.冒泡排序

冒泡排序的核心思想是:两两相邻元素进行比较。

9  8  7  6  5  4  3  2  1  0

9  7  6  5  4  3  2  1  0

8  7  9  6  5  4  3  2  1  0                                                8  7  6  5  4  3  2  1  0  9

8  7  6  5  4  3  2  1  0                                                7  8  6  5  4  3  2  1  0  9

8  7  6  5  9  4  3  2  1  0                                                7  6  8  5  4  3  2  1  0  9

8  7  6  5  4  9  3  2  1  0                                                7  6  5  8  4  3  2  1  0  9

8  7  6  5  4  3  9  2  1  0                                                7  6  5  4  8  3  2  1  0  9

8  7  6  5  4  3  2  9  1  0                                                .。。。。。。。。。。。

8  7  6  5  4  3  2  1  0                                                7  6  5  4  3  2  1  8  0  9

8  7  6  5  4  3  2  1  0  9                                                7  6  5  4  3  2  1  0  8  9

 这是第一趟,解决了一个数字的排序,10个元素要比较9次,9个元素要比较8次,8个元素要比较7次,n个元素要比较n-1次。

#include<stdio.h>
//升序
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])	//比如arr[j]是9,arr[j+1]是8,
                                        //要升序排列就把8和9的位置交换一下
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
//打印
void print_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main(void)
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	//排序
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	//打印
	print_sort(arr, sz);
	return 0;
}

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

#include<stdio.h>

int main(void)
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7, };

	int* arr[] = { arr1,arr2,arr3 };

	//打印数组
	int i = 0;//有3组
	for (i = 0; i < 3; i++)
	{
		int j = 0;//5个元素
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 

 

 

9.字符指针变量

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值