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

目录

  • 四、指针
    • [4.1 指针基础](#4.1 指针基础)
    • [4.2 指针与数组](#4.2 指针与数组)
    • [4.3 指针与结构](#4.3 指针与结构)
    • [4.4 二重指针](#4.4 二重指针)
    • [4.5 字符指针](#4.5 字符指针)
    • [4.6 动态内存](#4.6 动态内存)
  • 五、函数
    • [5.1 函数参数](#5.1 函数参数)
    • [5.2 函数与数组](#5.2 函数与数组)
    • [5.3 函数指针](#5.3 函数指针)
    • [5.4 函数与结构](#5.4 函数与结构)
    • [5.5 递归函数](#5.5 递归函数)
    • [5.6 作用域与存储类型](#5.6 作用域与存储类型)
    • [5.7 模块化设计](#5.7 模块化设计)

四、指针

4.1 指针基础

内存中的地址按字节编号,每个字节的存储单元均对应一个地址。














cpp 复制代码
#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 指针与数组



注意:数组名是指针常量,不是指针变量,不能给数组名赋值。

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

cpp 复制代码
#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种访问数组元素的方法:

第一种:

cpp 复制代码
#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;
}

第二种:

cpp 复制代码
#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;
}

第三种:

cpp 复制代码
#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;
}

第四种:

cpp 复制代码
#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;
}

第五种:

cpp 复制代码
#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;
}



指针与二维数组






二维数组元素的访问

cpp 复制代码
#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;
}
cpp 复制代码
#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;
}
cpp 复制代码
#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;
}
cpp 复制代码
#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;
}

用列地址初始化

cpp 复制代码
#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;
}
cpp 复制代码
#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 指针与结构

cpp 复制代码
#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 字符指针

cpp 复制代码
#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为止)

cpp 复制代码
#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

cpp 复制代码
#include<stdio.h>
#include<string.h>

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

完美输出hello

cpp 复制代码
#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 函数指针



cpp 复制代码
#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 函数与结构

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

cpp 复制代码
#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++内容敬请关注~

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

相关推荐
奋斗的小花生2 小时前
c++ 多态性
开发语言·c++
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
霁月风4 小时前
设计模式——适配器模式
c++·适配器模式
jrrz08285 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
咖啡里的茶i5 小时前
Vehicle友元Date多态Sedan和Truck
c++
海绵波波1075 小时前
Webserver(4.9)本地套接字的通信
c++
@小博的博客5 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
爱吃喵的鲤鱼6 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
DARLING Zero two♡7 小时前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技