【C语言】深入理解指针(二)

1.数组名的理解

其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:
• sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节
• &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)
除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。

2.使用指针访问数组

一比较
arr+i = &arr[i]
*(arr+i) = arr[i]
arr[i][j]=* ( *(arr+i)+j) )

//使用下标的方式
int i = 0;
for (i = 0; i < sz; i++)
{
	scanf("%d ", &arr[i]);
}
for (i = 0; i < sz; i++)
{
	printf("%d ", arr[i]);
}
#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("%d", p+i);
 	//scanf("%d", arr+i);//也可以这样写
 }
 //输出
 for(i=0; i<sz; i++)
 {
 printf("%d ", *(p+i));
 }
 return 0;
}

3.一维数组传参的本质

test(arr);
void test(int arr[])//参数写成数组形式,本质上还是指针
arr[]=*arr
void test(int* arr)//参数写成指针形式

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

4.冒泡排序

冒泡排序的核⼼思想就是:两两相邻的元素进⾏⽐较

//⽅法2 - 优化 
//默认升序,一趟解决一个最大值
void bubble_sort(int arr[], int sz)//参数接收数组元素个数 
{
    int i = 0;
    for(i=0; i<sz-1; i++)//确定趟数  0进来,0<9,一共9趟
    {
        int flag = 1;//假设这⼀趟已经有序了 
        int j = 0;
        for(j=0; j<sz-i-1; j++)//一趟9对比较,二趟8对比较
        {
            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;
    }
}
int main()
{
    int arr[] = {3,1,7,5,8,9,0,2,4,6};
    int sz = sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr, sz);
    int i = 0;
    for(i=0; i<sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

5.二级指针

在这里插入图片描述
对于⼆级指针的运算有:
在这里插入图片描述

6.指针数组

整型数组,是存放整型的数组,字符数组是存放字符的数组
指针数组的每个元素都是⽤来存放地址(指针)的。在这里插入图片描述
在这里插入图片描述

注意:
int arr[10]
int
p1[10]
这两个都是指针数组,别不认识了

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*的,就可以存放在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;
}

在这里插入图片描述
parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。

上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值