c语言学习(数组三)

       今天我主要学习了指针运算、指针历遍、冒泡排序、二级指针、指针模拟二维数组等内容,下面将我今天所学知识分享给大家

1. 数组地址与指针运算

int main()
{
    int arr[10] = { 0 };
    printf("arr =%p\n", arr);            // arr是数组首元素地址
    printf("arr+1 =%p\n", arr + 1);      // arr+1是下一个元素的地址(加一个int大小)
    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);   // 跳过整个数组的地址(加10个int大小)
    return 0;
}

2. 指针遍历数组输入输出(方式一)

int main()
{
    int arr1[10] = { 0 };
    int* p = arr1;  // p指向数组首元素
    int sz = sizeof(arr1) / sizeof(arr1[0]);  // 计算数组元素个数
    
    // 输入数据
    for (int i = 0; i < sz; i++)
    {
        scanf("%d", p);  // 通过指针输入数据
        p++;             // 指针移动到下一个元素
    }
    
    // 重置指针并输出
    p = arr1;
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", *p);  // 解引用指针输出值
        p++;
    }
}

3. 指针遍历数组输入输出(方式二)

int main()
{
    int arr1[10] = { 0 };
    int* p = arr1;
    int sz = sizeof(arr1) / sizeof(arr1[0]);
    
    // 使用数组名+偏移量输入
    for (int i = 0; i < sz; i++)
    {
        scanf("%d", arr1 + i);  // arr1+i等价于&arr1[i]
    }
    
    // 使用指针数组下标输出
    for (int i = 0; i < sz; i++) 
    {
        printf("%d ", p[i]);  // p[i]等价于*(p+i)和arr1[i]
    }
}

4. 冒泡排序函数实现

void bubble_turn(int arr1[], int sz)
{
    for (int i = 0; i < sz - 1; i++)  // 外层循环控制轮次
    {
        for (int j = 0; j < sz - 1 - i; j++)  // 内层循环控制比较
        {
            if (arr1[j] > arr1[j + 1])  // 前大于后则交换
            {
                // 使用异或运算交换值(不借助临时变量)
                arr1[j] = arr1[j] ^ arr1[j + 1];
                arr1[j + 1] = arr1[j] ^ arr1[j + 1];
                arr1[j] = arr1[j] ^ arr1[j + 1];
            }
        }
    }
}

void print_arr(int arr[], int sz)
{
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);  // 打印数组元素
    }
}

int main()
{
    int arr1[] = { 1,4,6,7,2,5,9,3,8 };
    int sz = sizeof(arr1) / sizeof(arr1[0]);
    bubble_turn(arr1, sz);  // 排序
    print_arr(arr1, sz);    // 打印
}

5. 二级指针的使用

int main()
{
    int a = 0;
    int* pa = &a;     // 一级指针,指向a的地址
    int** ppa = &pa;  // 二级指针,指向pa的地址
    
    printf("%d\n", a);    // 直接访问
    printf("%d\n", *pa);  // 一级解引用
    printf("%d\n", &zwnj;**ppa);// 二级解引用(*ppa得到pa,**&zwnj;ppa得到a)
}

6. 指针数组的基本使用

int main()
{
    int arr1[10] = { 0,1,2,3,4,5,6,7,8,9 };
    int* parr1[10] = { &arr1[0] };  // 指针数组,初始化为arr1首地址
    
    for (int i = 0; i < 10; i++)
    {
        parr1[i] = &arr1[i];  // 存储每个元素的地址
        printf("&%d = ", *parr1[i]);  // 解引用打印值
        printf("parr1[%d]=%p\n", i, parr1[i]);  // 打印地址
    }
    return 0;
}

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

int main()
{
    int arr1[5] = { 0,1,2,3,4 };
    int arr2[5] = { 1,2,3,4,5 };
    int arr3[5] = { 2,3,4,5,6 };
    
    // 指针数组存储三个一维数组的首地址
    int* parr[3] = { arr1, arr2, arr3 };
    
    // 模拟二维数组访问
    for (int i = 0; i < 3; i++)  // "行"
    {
        for (int j = 0; j < 5; j++)  // "列"
        {
            printf("%d ", parr[i][j]);  // 等价于*(parr[i]+j)
        }
        printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值