C语言指针

C语言指针简介

什么是指针?

指针是C语言中一种特殊的变量,它可以存储另一个变量的内存地址。通过指针,我们可以间接地访问和修改内存中的数据,而不需要知道具体的变量名或者位置。指针的使用可以提高程序的效率和灵活性,但也需要注意指针的正确性和安全性。

如何定义和使用指针?

要定义一个指针,我们需要在变量类型前加上一个星号,表示这是一个指针类型的变量。例如,int *p;表示定义了一个指向整型变量的指针。要给指针赋值,我们需要使用取地址运算符(&),表示获取一个变量的内存地址。例如,p = &a;表示把变量a的地址赋给指针p。要通过指针访问或者修改指向的变量的值,我们需要使用解引用运算符(*),表示获取指针指向的内存地址中的数据。例如,*p = 10;表示把指针p指向的变量的值修改为10。

下面是一个简单的例子,演示了指针的定义和使用:

#include <stdio.h>

int main()
{
    int a = 5; // 定义一个整型变量a,赋值为5
    int *p; // 定义一个指向整型变量的指针p
    p = &a; // 把变量a的地址赋给指针p
    printf("a = %d\n", a); // 输出变量a的值,为5
    printf("*p = %d\n", *p); // 输出指针p指向的变量的值,为5
    *p = 10; // 把指针p指向的变量的值修改为10
    printf("a = %d\n", a); // 输出变量a的值,为10
    printf("*p = %d\n", *p); // 输出指针p指向的变量的值,为10
    return 0;
}

//指针的常见用途
//指针在C语言中有很多用途,下面列举了一些常见的场景:
/*
函数参数传递:通过指针,我们可以实现函数的按引用传递,即函数可以修改传入的参数的值,
而不是只能使用参数的副本。这样可以避免参数的拷贝,提高程序的效率,
也可以实现多个返回值的效果。例如,下面的函数可以交换两个整型变量的值:*/
void swap(int *a, int *b) // 定义一个函数,接受两个指向整型变量的指针作为参数
{
    int temp; // 定义一个临时变量
    temp = *a; // 把指针a指向的变量的值赋给临时变量
    *a = *b; // 把指针b指向的变量的值赋给指针a指向的变量
    *b = temp; // 把临时变量的值赋给指针b指向的变量
}

/*动态内存分配:通过指针,我们可以在程序运行时根据需要动态地分配和释放内存空间,
而不需要事先确定内存的大小和数量。这样可以提高程序的灵活性和适应性,
也可以避免内存的浪费和溢出。C语言提供了一些函数,如malloc,calloc,realloc,free等,
用于实现动态内存分配和释放。例如,下面的代码可以动态地创建一个整型数组,并给它赋值:*/
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n; // 定义一个整型变量n,表示数组的大小
    int *arr; // 定义一个指向整型变量的指针arr,表示数组
    printf("Enter the size of the array: ");
    scanf("%d", &n); // 输入数组的大小
    arr = (int *)malloc(n * sizeof(int)); // 通过malloc函数,根据数组的大小,动态地分配内存空间,并把返回的地址赋给指针arr
    if (arr == NULL) // 判断是否分配成功,如果返回的地址是NULL,表示分配失败
    {
        printf("Memory allocation failed.\n");
        exit(1); // 退出程序
    }
    for (int i = 0; i < n; i++) // 遍历数组
    {
        arr[i] = i + 1; // 给数组的每个元素赋值
    }
    for (int i = 0; i < n; i++) // 遍历数组
    {
        printf("%d ", arr[i]); // 输出数组的每个元素
    }
    printf("\n");
    free(arr); // 通过free函数,释放指针arr指向的内存空间
    return 0;
}

/*数组和字符串:通过指针,我们可以实现对数组和字符串的操作,而不需要使用下标。
这样可以简化代码,提高程序的速度,也可以避免数组越界的错误。
数组和字符串本质上都是一段连续的内存空间,数组的名字和字符串的字面量都是指向第一个元素的指针。
我们可以通过指针的加减运算,来移动指针的位置,从而访问和修改数组和字符串中的元素。
例如,下面的代码可以实现字符串的反转:*/
#include <stdio.h>
#include <string.h>

void reverse(char *str) // 定义一个函数,接受一个指向字符的指针作为参数,表示字符串
{
    char *start, *end, temp; // 定义两个指向字符的指针start和end,表示字符串的首尾,以及一个临时变量temp
    start = str; // 把字符串的地址赋给指针start
    end = str + strlen(str) - 1; // 把字符串的最后一个字符的地址赋给指针end
    while (start < end) // 当指针start小于指针end时,循环执行
    {
        temp = *start; // 把指针start指向的字符的值赋给临时变量
        *start = *end; // 把指针end指向的字符的值赋给指针start指向的字符
        *end = temp; // 把临时变量的值赋给指针end指向的字符
        start++; // 把指针start向后移动一位
        end--; // 把指针end向前移动一位
    }
}

int main()
{
    char str[] = "Hello, world!"; // 定义一个字符数组,表示字符串
    printf("Original string: %s\n", str); // 输出原始字符串
    reverse(str); // 调用reverse函数,传入字符串的地址
    printf("Reversed string: %s\n", str); // 输出反转后的字符串
    return 0;
}
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值