【C/C++】C语言程序设计基础知识(指针、函数)

四、指针

4.1 指针基础

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
内存中的地址按字节编号,每个字节的存储单元均对应一个地址。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    int *p_max = &a,*p_min = &b,*p;
    if(*p_max < *p_min){
        p = p_max;
        p_max = p_min;
        p_min = p;
    }
    printf("%d %d\n",*p_min,*p_max);
    return 0;
}

在这里插入图片描述
在这里插入图片描述

4.2 指针与数组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意:数组名是指针常量,不是指针变量,不能给数组名赋值。

用指针访问数组,计算数组元素之和

#include<stdio.h>

int main()
{
    int array[10] = {0,2,4,6,8,10,12,14,16,18};
    int sum = 0;
    int *p = array; //指针指向数组
    for(int i=0;i<10;i++){
        sum += *p;
        p++;
    }
    printf("总和是%d\n",sum);
    return 0;
}

注意不能写成:sum+=*array;array++;
数组名不可以执行++操作,因为它是一个常量

p++并不是将指针变量p的值简单加1,而是加上了一个基类型所占有的字节数,即移动了sizeof(int)=4个字节

我们可以通过指针移动快速访问数组,但通过指针也只能逐个处理数据,不能一次性整体处理数组所有元素。

利用数组求和的例子,总结一下有5种访问数组元素的方法:
第一种:

#include<stdio.h>

int main()
{
    int array[] = {1,4,2,7,13,32,21,48,16,30};
    int size = sizeof(array)/sizeof(*array),sum = 0;

    for(int i=0;i<size;i++){
        sum += array[i];
    }
    printf("%d\n",sum);
    return 0;
}

第二种:

#include<stdio.h>

int main()
{
    int array[] = {1,4,2,7,13,32,21,48,16,30};
    int size = sizeof(array)/sizeof(*array),sum = 0;
    int *p = array;
    for(int i=0;i<size;i++){
        sum += *p;
        p++;
    }
    printf("%d\n",sum);
    return 0;
}

第三种:

#include<stdio.h>

int main()
{
    int array[] = {1,4,2,7,13,32,21,48,16,30};
    int size = sizeof(array)/sizeof(*array),sum = 0;
    int *p = array;
    for(int i=0;i<size;i++){
        sum += *(p+i);
    }
    printf("%d\n",sum);
    return 0;
}

第四种:

#include<stdio.h>

int main()
{
    int array[] = {1,4,2,7,13,32,21,48,16,30};
    int size = sizeof(array)/sizeof(*array),sum = 0;
    int *p = array;
    for(int i=0;i<size;i++){
        sum += p[i];
    }
    printf("%d\n",sum);
    return 0;
}

第五种:

#include<stdio.h>

int main()
{
    int array[] = {1,4,2,7,13,32,21,48,16,30};
    int size = sizeof(array)/sizeof(*array),sum = 0;
    for(int i=0;i<size;i++){
        sum += *(array+i);
    }
    printf("%d\n",sum);
    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

指针与二维数组
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二维数组元素的访问

#include<stdio.h>

int main()
{
    int a[3][4] = {1,2,3,4,6,6,6,6,5,7,9,8};
    int (*p)[4];
    p=a;
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++){
            printf("%d ",p[i][j]);
        }
    }
    return 0;
}
#include<stdio.h>

int main()
{
    int a[3][4] = {1,2,3,4,6,6,6,6,5,7,9,8};
    int (*p)[4];
    p=a;
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++){
            printf("%d ",*(p[i]+j));
        }
    }
    return 0;
}

#include<stdio.h>

int main()
{
    int a[3][4] = {1,2,3,4,6,6,6,6,5,7,9,8};
    int (*p)[4];
    p=a;
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++){
            printf("%d ",*(*(p+i)+j));
        }
    }
    return 0;
}

#include<stdio.h>

int main()
{
    int a[3][4] = {1,2,3,4,6,6,6,6,5,7,9,8};
    int (*p)[4];
    p=a;
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++){
            printf("%d ",(*(p+i))[j]);
        }
    }
    return 0;
}

用列地址初始化

#include<stdio.h>

int main()
{
    int a[3][4] = {1,2,3,4,6,6,6,6,5,7,9,8};
    int *p = *a;
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++){
            printf("%d ",*(p+i*4+j));
        }
    }
    return 0;
}

#include<stdio.h>

int main()
{
    int a[3][4] = {1,2,3,4,6,6,6,6,5,7,9,8};
    int *p = *a;
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++){
            printf("%d ",p[i*4+j]);
        }
    }
    return 0;
}

4.3 指针与结构

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

struct info{
    short num;
    char name[5];
};

int main()
{
    struct info info1,info2;
    struct info *p1 = &info1,*p2 = &info2;
    p1 -> num = 2;
    strcpy((*p1).name,"good");
    *p2 = *p1;
    printf("%d\n",p2->num);
    printf("%c\n",p2->name[3]);
    return 0;
}

在这里插入图片描述

在这里插入图片描述

4.4 二重指针

在这里插入图片描述

4.5 字符指针

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

int main()
{
    char buffer[] = {'h','e','l','l','o'};
    char *p = buffer;
    printf("%s\n",p);
    return 0;
}

输出:hello*****(后面是乱字符,直到最后为\0为止)

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

int main()
{
    char buffer[] = {'h','e','l','l','o'};
    char *p = buffer;
    printf("%c\n",*p);
    return 0;
}

输出:h

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

int main()
{
    char buffer[] = "hello";
    char *p = buffer;
    printf("%s\n",p);
    return 0;
}

完美输出hello

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

int main()
{
    char buffer[] = "hello";
    char *p = buffer;
    printf("%c\n",*p);
    return 0;
}

输出:h

4.6 动态内存

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

五、函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
1.返回值类型
2.函数名
3.形参表,函数入口
4.函数内部可以定义只能自己使用的变量,称内部变亘
5.返回值作为函数调用表达式的值

5.1 函数参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2 函数与数组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 函数指针

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

char* match(char c, char *sp);

int main()
{
    char s[80],ch,*p;
    int pos;
    gets(s);
    ch = getchar();
    p = match(ch,s);
    if(p){
        pos = strlen(s) - strlen(p) + 1;
        printf("%s %d\n",p,pos);
    }
    else{
        printf("no match found");
    }
    return 0;
}

char* match(char c,char *sp){
    int count = 0;
    while(c!=sp[count] && sp[count]!='\0'){
        count++;
    }
    if(sp[count]) return (&sp[count]);
    return (0);
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.4 函数与结构

在这里插入图片描述

例:计算一组学生的平均成绩和不及格人数

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

struct stu{
    int num;
    char *name;
    char sex;
    float score;
};
int ave(struct stu *ps,int n,float *average);

struct stu boy[5] = {
    {101,"Li ping",'M',45},
    {102,"zhang ping",'M',62.5},
    {103,"he fang",'F',92.5},
    {104,"cheng ling",'F',87},
    {105,"wang ming",'M',58}
};

int main()
{
    float average;
    int m;
    m = ave(boy,5,&average);
    printf("平均分是%.2f,未通过人数%d\n",average,m);
    return 0;
}

int ave(struct stu *ps,int n,float *average){
    int c = 0,i;
    float ave,s = 0;
    for(i=0;i<n;i++,ps++){
        s+=ps->score;
        if(ps->score<60) c+=1;
    }
    *average = s/n;
    return c;
}

5.5 递归函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.6 作用域与存储类型

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.7 模块化设计

在这里插入图片描述
在这里插入图片描述

未完待续,后续更新C++内容敬请关注~

声明:仅供学习参考使用,不另做他用,侵删

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值