C语言基础(11)指针的概念和基础用法

一、指针

        指针是一种用来存放地址的数据类型。

定义形式:                (基类型)*指针变量名

定义一个指针时,*符号是类型说明符,例如,int *p;声明了一个指向整数类型的指针p。

        取地址运算符 &:获取变量的内存地址。例如,int a = 5; int *p = &a;将变量a的地址赋值给指针p

        指针运算符 *:通过指针访问指针指向的变量。例如,int value = *p;将指针p指向的地址中的值赋给变量value

二、指针的引用

        指针传递:在函数调用时,指针作为参数传递的是变量的地址,而不是变量的副本。这意味着在函数内部对指针所指向的变量进行的修改会影响到原始变量,即通过指针运算可以实现在被调函数中修改主调函数中的内容。

        指针的执行步骤:

        1.通过指针变量中的值到内存空间中定位。

        2.从定位处开始向后偏移sizeof(基类型)个字节。

        3.将偏移好的那部分内存空间看作是一个基类型

        当定义一个指针后,既不初始化也不赋值时,指针中的地址为随机值,这种指针称为野指针,野指针很危险,使用野指针会导致程序崩溃。

空指针:空指针是指不指向任何有效内存地址的指针,通常用NULL表示。

二、指针的运用

1.指针与数组

        数组名本质上是一个指向数组首元素的指针。例如,int arr[10]; int *p = arr;,此时p指向数组arr的首元素。

  • 指针算术:指针可以进行加减运算,以遍历数组。例如,p++使指针p指向下一个元素。

2.指针函数

        函数的返回值类型定义为指针类型时,这个函数就是指针函数

#include <stdio.h>
void maxMinOfThreeNumbers(int a,int b,int c,int *max,int *min)
{
    *max = a > b ? a : b;
    *max = *max > c? *max : c;
    *min = a > b ? b : a;
    *min = *min > c? c : *min;
}
void maxofnumber(int a,int b,int *max)
{
    *max = a > b ? a: b ;
}
void port(int i)
{
    char *p = (char *) &i;
    if(*p == 1)
    {
        puts("smallport");
    }
    else
    {
        puts("bigport");
    }
}
void maxOfArray(int *a,int len ,int *max)
{
    *max = *a;
    for(int i = 1 ; i < len ;++i)
    {
        *max = *max > *(a + i) ?*max : *(a + i);
    }
}
void swap(int *a,int*b)
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
}
void reverse(int *a,int len)
{
    for(int i = 0 ; i < len / 2; ++i)
    {
        swap(a + i , a + len - i - 1);
    }
}
void printArray(int *a, int len )
{
    for(int i = 0 ; i < len ;++i)
    {
        printf("%d ",*(a + i));
    }
    puts("");
}
void selectionsort(int *a,int len)
{
    for(int i = 0 ; i < len - 1 ; ++i)
    {
        for(int j = i + 1; j < len ; ++j)
        {
            if(*(a + i) > *(a + j))
            {
                swap(a + i , a + j);
            }
        }
    }
}
void bubbleSort(int *a,int len)
{
    for(int i = len - 1 ; i > 0; -- i)
    {
        for(int j = 0; j < i ; ++j)
        {
            if(*(a + j ) > *(a + j + 1))
            {
                 swap(a + j , a + j + 1);
            }
        }
    }
}
void insertionsort(int *a,int len)
{
    for(int i = 0 ; i < len ; ++i)
    {
        int t = *(a + i);
        int j = i;
        while( j > 0 && *(a + j - 1) > 0)
        {
            *(a + i) = *(a + j - 1);
            --j;
        }
        *(a + j) = t;
    }
}
int *binarySearch(int *a,int len,int n)
{
    int begin = 0 , end = len,i,mid;
    while(begin <= end)
    {
        mid = (begin + end) / 2 ;
        if( n > *(a + mid))
        {
            begin = mid + 1;
        }
        else if(n < *(a + mid))
        {
            end = end - 1;
        }
        else 
        {
            return a + mid;
        }
    }
    return NULL;
}

void main(void)
{
    int a[] = {1,2,3,4,5,6,7,8,9,0};
    int len = sizeof(a) / sizeof (a[0]);
    //reverse(a,len);
    //bubbleSort(a,len);
    //selectionsort(a,len);
    insertionsort(a,len);
    int *ret = binarySearch(a,len,5);
    if (ret == NULL)
    {
        puts("Not found");
    }
    else
    {
        puts("found");
        printf("address = %p\n",ret);
    }
    printArray(a,len);
    // int a = 10 , b = 15,c = 25,i = 1;
    // int max,min;
    // maxofnumber(a,b,&max);
    // maxMinOfThreeNumbers(a,b,c,&max,&min);
    // printf("%d,%d\n",max,min);
    //int *p = a,sum = 0;
    //int max;
    //maxOfArray(a,len,&max);
    //printf("%d\n",max);
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值