新手c语言讲解及题目分享(十三)--指针专项练习

目录

前言

一.指针变量

1.指针变量的定义形式:

2.指针变量的引用:

Ⅰ.给指针变量赋值:

Ⅱ.引用指针变量指向变量:

二.地址与地址内容的概念

1.地址:

2.地址内容:

三.经验总结和习题分享

1.经验总结:

2.习题分享:

Ⅰ.交换两个整数的值

Ⅱ.使用指针访问数组元素

Ⅲ.字符串反转

Ⅳ.动态内存分配

Ⅴ.指针作为函数返回值

Ⅵ.指针数组和指向指针的指针

Ⅶ.动态分配二维数组


前言

指针是c语言中一个十分重要的概念,也是c语言的重要特色,正确而灵活地运用指针,可以使程序简洁,紧凑,高效。利用指针变量不仅可以有效地表示各种数据结构,也可以用于参数传递和动态分配空间。本人每天不定时分享一些自己的学习经验和一些32的项目。

一.指针变量

存放地址的变量是指针变量,它用来指向另一个对象(如变量,数据,函数,结构体等)。、

指针是一个变量的地址;指针变量是专门存放变量地址的变量;

1.指针变量的定义形式:

数据类型  *指针变量名;

int *p1;

    注:“ *p1 ”代表指针p1所指单元的内容;“p1 ”则代表指针变量;

2.指针变量的引用:

在引用指针变量时,主要有两种情况:

Ⅰ.给指针变量赋值:
p=&a

指针变量p的值是变量a的地址。

Ⅱ.引用指针变量指向变量:
printf("%d\n",*p);

以整型的形式输出指针变量p所指向的变量的值。

注:&是取地址符,&a代表是变量a的地址。

二.地址与地址内容的概念

1.地址:

地址是内存中每个字节单元的唯一标识。在计算机的内存中,每个存储位置(比如一个字节)都有一个地址,就像现实中的门牌号一样。在C语言中,地址通常用十六进制数表示,可以通过取地址运算符 & 来获得任何变量或数据的地址。

int var = 10;
printf("变量var的地址是:%p\n", (void*)&var);

这里的 %p 是用于打印地址的格式化字符串,(void*)&var 是获取变量 var 的地址。

2.地址内容:

地址中的内容指的是存储在特定内存地址处的数据。在C语言中,可以通过解引用指针来访问地址中的内容,使用运算符 * 来实现。

int var = 10;
int *ptr = &var; // ptr是指向var的指针,存储了var的地址
printf("地址中的内容是:%d\n", *ptr); // 解引用指针,获取地址中的内容

在这个例子中,*ptr 会给出指针 ptr 所指向地址(即变量 var 的地址)中的内容,也就是数值 10

三.经验总结和习题分享

1.经验总结:

学习指针的经验总结:理解指针的本质是内存地址的引用,通过从基础概念入手,循序渐进地练习指针与数组、函数的交互,并在实践中不断调试和反思,可以有效提升对指针操作的熟练度和深度,进而掌握C语言的核心技能。

2.习题分享:


Ⅰ.交换两个整数的值

编写一个函数,使用指针参数交换两个整数的值。

#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 10, y = 20;
    printf("交换前:x = %d, y = %d\n", x, y);
    swap(&x, &y);
    printf("交换后:x = %d, y = %d\n", x, y);
    return 0;
}
Ⅱ.使用指针访问数组元素

编写一个程序,使用指针访问并打印数组中的所有元素。

#include <stdio.h>

void printArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", *(arr + i));
    }
    printf("\n");
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    printArray(arr, size);
    return 0;
}
Ⅲ.字符串反转

编写一个函数,使用指针反转一个字符串

#include <stdio.h>
#include <string.h>

void reverseString(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

int main() {
    char str[] = "Hello, World!";
    printf("原始字符串: %s\n", str);
    reverseString(str);
    printf("反转后的字符串: %s\n", str);
    return 0;
}
Ⅳ.动态内存分配

编写一个程序,使用malloc和free动态分配和释放内存。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(5 * sizeof(int)); // 分配5个整数的空间
    if (ptr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 使用分配的内存
    for (int i = 0; i < 5; i++) {
        ptr[i] = i + 1;
    }

    // 打印分配的内存内容
    for (int i = 0; i < 5; i++) {
        printf("%d ", ptr[i]);
    }
    printf("\n");

    // 释放内存
    free(ptr);
    return 0;
}
Ⅴ.指针作为函数返回值

编写一个函数,返回一个指向整数的指针。

#include <stdio.h>

int* createPointerToInteger() {
    int value = 100;
    return &value; // 注意:返回局部变量的地址是不安全的
}

int main() {
    int *ptr = createPointerToInteger();
    printf("指针指向的值是:%d\n", *ptr);
    // 注意:这里访问的值可能是不确定的,因为函数返回的局部变量的地址在函数返回后不再有效
    return 0;
}
Ⅵ.指针数组和指向指针的指针

编写一个程序,使用指针数组来存储字符串,并使用指向指针的指针来访问这些字符串。

#include <stdio.h>

int main() {
    char *names[] = {"Alice", "Bob", "Charlie"};
    char **ptr = names; // 指向指针数组的指针

    for (int i = 0; i < 3; i++) {
        printf("%s\n", *(ptr + i));
    }
    return 0;
}
Ⅶ.动态分配二维数组

编写一个程序,使用malloc动态分配一个二维数组,并使用指针来访问和打印数组的内容。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows = 3;
    int cols = 4;
    int **array = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        array[i] = (int *)malloc(cols * sizeof(int));
    }

    // 初始化二维数组
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            array[i][j] = i * cols + j;
        }
    }

    // 打印二维数组
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
        free(array[i]); // 释放每一行的内存
    }
    free(array); // 释放指向行的指针数组的内存
    return 0;
}

------------------每天不定时分享,如果对你有帮助就点点关注吧,大佬们!!!!!!----------------

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱娆π

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值