指针的理解part2

目录

1.数组名

2.指针访问数组

3.一维数组传参本质

4.冒泡排序

5.二级指针

6.指针数组 

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


1.数组名

&arr[0];
arr;
这两个值的结果是一样的,也就是说都存储着数组首元素的地址
数组名放入sizeof计算时,计算的是整个数组的大小
数组名存的是首地址,至于&arr这样的,是整个数组地址

 &arr[0]与&arr[0]+1相差4字节,arr与arr+1也是相差4字节,这是因为他们跳过的是一个元素,而int类型一个元素占4个字节,所以相差4字节。而&arr与&arr+1相差了40字节,是因为这个数组一共有10个元素,一共占了40字节空间,跳过了一个数组。

2.指针访问数组

输入
int *p=arr;
for (i=0;i<sz;i++)
{
    scanf("%d",p+i);arr+i也行
}
输出
printf("%d",*(p+i));

本质上arr[1]被编译器转换为*(arr+1);同理,直接用p(i)也能访问数组,也是等同于*(p+i)。

同理,i[arr]本质上也是如此,arr[i]==*(arr+i)==*(i+arr)==i[arr]

3.一维数组传参本质

由于数组名是数组首元素的地址,所以当传参时,传递的是数组首元素的地址,而不是整个数组。

如果传递数组给函数,那么无法在函数内部计算数组的元素个数,sizeof算不出元素个数。

但就算是以指针的形式传参,在函数内部计算时,也只能算出指针变量的大小,比如32位机器4字节。

由此可知,无法在函数内部计算外来数组的元素个数

4.冒泡排序

#include<stdio.h>
void mp(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz-1; i++)//比如10个数字,那么要进行9趟
	{
		int j = 0;
		for (j = 0; j < sz - i-1 ; j++)//从左往右,两两比对,最大或最小都会放最右边
//那部分不需要再交换了,所以减去i,由于有j+1,所以要再-1,防止越界访问,
//如果是<=,就不能-1了,因为必须-2,因为要保证循环只能到倒数第2个数
//(这也有j+1的原因,如果没有j+1,则是最后一个数即可)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}


int main()
{
	int arr[] = { 2,1,5,4,3,6,7,9,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	mp(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 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-i-1; 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;
 }
}

5.二级指针

二级指针 指的是指针变量的地址

*ppa是对ppa存的地址进行解引用,指向了pa的内容,也就是pa存储的地址,但不进行下一步引用,不会指向pa存储的地址代表的变量。

**ppa则不同,先对ppa的存储的地址进行解引用,指向pa的存储的地址,接下再对pa存储的地址解引用,指向了pa存储的地址代表的变量。

6.指针数组 

指针数组是存储指针的数组

指针数组的每一个元素都是一个指针,存储着地址。还可以对元素进行解引用。

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

#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* par[3] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", par[i][j]);
		}
		printf("\n");
	}
	return 0;
}

par是一个指针数组,由于arr数组名存储着数组的首元素地址,所以可以数组存在指针数组中,前提都是int类型。

par[i]==*(par+i)

par[i][j]== *(*(par+i)+j)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值