iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何分析C/C++指针、函数、结构体和共用体
  • 911
分享到

如何分析C/C++指针、函数、结构体和共用体

2023-06-28 23:06:05 911人浏览 独家记忆
摘要

如何分析C/C++指针、函数、结构体和共用体,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。指针变量与地址变量给谁用的?变量是对某一块空间的抽象命名。变量名就是你抽象出来的某

如何分析C/C++指针、函数、结构体和共用体,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

指针

变量与地址

变量给谁用的?
变量是对某一块空间的抽象命名。
变量名就是你抽象出来的某块空间的别名。
指针就是地址。指向某个地址。

指针与指针变量

指针是指向某块地址。指针(地址)是常量。
指针变量是可以发生变化的。

如何分析C/C++指针、函数、结构体和共用体

#include <stdio.h>int main(){    int i = 1;    int *p = &i;        printf("i = %d  \n", i);    printf("&i = %p \n", &i);    printf(" p = %p \n", p);    printf("&p = %p \n", &p);    printf("*p = %d \n", *p);    // 为什么不用char* p = &i;    //TYPE  NAME = VALUE    //int*  p    = &i;    //int   i    = 1;}

直接访问间接访问

如何分析C/C++指针、函数、结构体和共用体

占内存空间

都是8字节,linux 64 位中。

空指针 野指针 空类型

int * i= NULL;

指针运算

两个指针同时指向一个数组。++ 、--、比较、关系、&、*

指针与一维数组

数组名和 指针的区别?
a是数组名字是一个表示地址的常量。
指针是一个变量。
a++;
p++;

#include <stdio.h>int main(){    int a[3] = {1,2,3};    int *p = a;    int i;    for(i = 0;i < sizeof(a)/sizeof(*a); i++) {        printf("%d %d %d %d \n",a[i],*(a+i),p[i],*(p+i)); // a[i]        printf("%p %p %p %p \n",a+i, &a[i],p+i, p+i); // &a[i]    }    printf("\n");}

这里代码体现什么是指针常量什么是指针变量?

#include <stdio.h>int main(){    int a[3];    int i;    int *p = a;    for(i = 0;i < sizeof(a)/sizeof(*a); i++) {        printf("%p -> %d\n",&a[i],a[i]);    }    for(i = 0;i <sizeof(a)/sizeof(*a); i++) {        scanf("%d",p++);    //p = a;    for(i = 0;i < sizeof(a)/sizeof(*a); i++,p++) {        printf("%p -> %d\n",p,*p);    printf("\n");}

指针与二维数组

如何分析C/C++指针、函数、结构体和共用体

#include <stdio.h>#include <stdlib.h>int main(){    int a[2][3] = {1,2,3,4,5,9};    int i,j;    int *p;//(W)    p = a;     //wall等号右边a是在行间跳转的指针    // 等号左边是列间跳转的指针    p = *(a+0);    //p = &a[0][0];/int main(){    #if 0        // cosnt修饰常规变量的使用特点        // 这个警告已经构成error        const float pi = 1.14159;        // pi = 9999.2;        float *p = &pi; // initialization discards ‘const' qualifier from pointer target type [enabled by default]        *p = 1223.333333;         // 修改方法 const float *p = &pi;         printf("%f\n",pi); // 1223.333333        printf("%f\n",*p);    #endif    // 常量指针:指针的指向可以发生变化但是指针所指向的目标值是不能变化的    // const  *p    // 值不能变    // 指向可以发生变化        int i = 1;    const int *p1 = &i;    int j = 88;//T    i= 10;   //F    *p1 = 99;//T    p1 = &j;    printf("%d\n",i);    printf("%d\n",*p1);    // 指针常量:指针的指向不能发生变化,指针所指向的目标变量的值可以发生变化。    int j= 100;    int * const p1 = &i;//T    *p1 = 10;//F     p1 = &j;    //const 左右都有 指向和值都不能变    int num = 10;    const int* const p3 = &num;    // *p3 = 99;    // p3 = &i;    exit(0);}

指针数组和数组指针的区别

数组指针

#include <stdio.h>#include <stdlib.h>int main(){    // 数组指针    int a[2][3] = {1,2,3,4,5,9};    int i,j;    int *p = *a;    int (*q)[3] = a;    //printf("%d \n", *a); // a[0][0]的地址    //printf("%d \n", **a); //1    #if 0    // printf("%d \n",*p);//q    //int *p = *a;    //printf("%d \n",*p); //q    // int (*q)[3] = a+1;    // printf("%d \n",**q); // 4    printf("\n");    for(i = 0;i < 2; i++) {        for(j = 0; j < 3; j++) {            // printf("%p->%d\n",*(a+i)+j,*(*(a+i)+j));            printf("%p->%d\n",*(q+i)+j,*(*(q+i)+j));        }        printf("\n");    }    #endif }

指针数组:

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){    char *name[5] ={"english","math","cpp","teacher","computer"};    int i,j;    for(i = 0; i < 5; i++) {        puts(name[i]);    }        for(i = 0; i < 5 ;i++) {        int k = i;        for(j = i+1;j < 5; j++) {            if(strcmp(name[k],name[j]) > 0) {                k = j;            }        }        if(k != i) {            char *tmp = name[i];            name[i] = name[k];            name[k] = tmp;            printf("排序后:\n");    exit(0);}

指针和函数

函数:

echo $? // 显示上个命令的返回值

如何分析C/C++指针、函数、结构体和共用体

#include <iOStream>using namespace std;//void func1(int *a,int n)void func1(int* a,int n,int *b){cout << "== b =" << *b<< endl; // 1for(int i = 0;i < n; i++){printf("%d ",*(a+i));}printf("\n");return ;}int main(int arGC, char** argv) {int arr[3] = {1,2,3};func1(arr,3,&arr[1]);//&(*(ar+1))return 0;

用指针与一维数组的使用:

void func2(int *p,int n){int m = n / 2;for(int i = 0;m--;i ++){int j = n - i -1;int tmp = *(p+i);*(p+i) = *(p+j);*(p+j) = tmp;}}int main(int argc, char** argv) {int arr[] = {1,2,3,6,4,2,38,4,2,23};//func1(arr,3,&arr[1]);//&(*(ar+1))func2(arr,10);for(int i = 0;i < 10;i ++)cout << arr[i] << ' ' ;cout <<endl;return 0;

函数与二维数组:

如何分析C/C++指针、函数、结构体和共用体

#include <iostream>using namespace std;void func(int *p,int n){for(int i = 0;i < n; i++){cout << *p << ' ';p++;}}void print_arr(int (*p)[3])for(int i = 0;i < 3;i++)for(int j = 0;j < 3;j++){cout << *(*(p+i)+j) << ' ';}cout<< endl;int main(int argc, char** argv) {int arr[3][3] = {1,2,3,6,4,2,38,4,2};func(arr[0],9); // *arr &arr[0][0]  arr[0]//  这里func(arr,9)  形参是int *p 就报错  p是一个列指针,二维数组不一样 print_arr(arr);return 0;

案例使用二维数组传参

float average_score(int *a,int n){float sum = 0.0;for(int i = 0;i < n; i++){sum += *(a+i);}return sum/n;}void find_num(int(*p)[3],int num){for(int i = 0;i < 3 ;i++)printf("%d ",*(*(p+num) + i));cout << endl;return ;}int main(int argc, char** argv) {int arr[3][3] = {1,2,3,6,4,2,38,4,2};float ave = 0.0;ave = average_score(*arr,9);printf("%f \n",ave);find_num(arr,0);return 0;}

函数与指针关系的详细剖析

指针函数

返回值 * 函数名(参数)

#if 0void find_num(int(*p)[3],int num){for(int i = 0;i < 3 ;i++)printf("%d ",*(*(p+num) + i));cout << endl;return ;}#else int * find_num(int(*p)[3],int num)return *(p+num);#endifint main(int argc, char** argv) {int arr[3][3] = {1,2,3,6,4,2,38,4,2};float ave = 0.0;ave = average_score(*arr,9);printf("%f \n",ave);int * res;res = find_num(arr,0);if(res != NULL){for(int i = 0;i < 3;i++)printf("%d ",res[i]);cout <<endl;}else printf("can not find\n");return 0;

函数指针

#include <iostream>using namespace std;int add(int a,int b){return a+b;} int sub(int a,int b){return a-b;}int main(int argc, char** argv) {int a = 2, b = 3;int (*p)(int,int);int (*q)(int,int);int ret;p = add;q = sub;printf("%d \n",p(a,b));printf("%d \n",q(a,b));return 0;}

如何分析C/C++指针、函数、结构体和共用体

回调函数

函数指针数组

类型 (*数组名[下标])(形参);

#include <iostream>using namespace std;int add(int a,int b){return a+b;} int sub(int a,int b){return a-b;}int main(int argc, char** argv) {int a = 2, b = 3;int (*funcp[2])(int,int);int ret;funcp[0] = add;funcp[1] = sub;for(int i = 0;i < 2; i++){ret = funcp[i](a,b);printf("%d \n",ret);}return 0;}

指向指针函数的函数指针数组
数组存放指针,指针指向函数,函数返回值是指针类型。

如何分析C/C++指针、函数、结构体和共用体

结构体

  • 产生的意义

  • 类型描述

  • 嵌套定义

  • 定义变量、初始化及引用

  • 占用内存大小

定义和使用:

#include <iostream>using namespace std;#define NAMESIZE 100struct simp_st {int i,j;float f;char ch;};struct birthday_stint year,month,day;struct student_stint id;char name[NAMESIZE];struct birthday_st birthday;int math;int chinese;int main(int argc, char** argv) struct student_st stu = {10011,"Alan",{3011,22,11},22,54};struct student_st *p = &stu;printf("%d %s %d-%d-%d %d %d \n",stu.id,stu.name,stu.birthday.year,stu.birthday.month,stu.birthday.day,stu.math,stu.chinese);printf("%d %s %d-%d-%d %d %d \n",p->id,p->name,p->birthday.year,p->birthday.month,p->birthday.day,p->math,p->chinese);struct student_st stu[2] = {{10011,"Alan",{3011,22,11},22,54},{10012,"salay",{2021,2,12},88,66}};struct student_st *p = &stu[0];// &stu[0]  stufor(int i = 0;i < 2;i++,p++){printf("%d %s %d-%d-%d %d %d \n",p->id,p->name,p->birthday.year,p->birthday.month,p->birthday.day,p->math,p->chinese);}return 0;}

内存对齐问题
addr/sizeof()

构造类型-结构体内存问题及函数传参

如何分析C/C++指针、函数、结构体和共用体

为后面linux高级铺垫。

  • 可以实现一个学生管理系统。

  • 产生及意义

  • 类型描述

  • 嵌套定义

  • 定义变量

  • 占用内存大小

  • 函数传参

  • 位域

uNIOn 名{数据类型 成员名1;数据类型 成员名2;};

枚举类型

enum 名{成员1;成员2;成员3;}

C语言是什么

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储器。

关于如何分析C/c++指针、函数、结构体和共用体问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网其他教程频道了解更多相关知识。

--结束END--

本文标题: 如何分析C/C++指针、函数、结构体和共用体

本文链接: https://www.lsjlt.com/news/321201.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何分析C/C++指针、函数、结构体和共用体
    如何分析C/C++指针、函数、结构体和共用体,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。指针变量与地址变量给谁用的变量是对某一块空间的抽象命名。变量名就是你抽象出来的某块...
    99+
    2023-06-28
  • 解析C/C++指针、函数、结构体、共用体
    目录指针变量与地址指针与指针变量占内存空间指针运算指针 变量与地址 变量给谁用的变量是对某一块空间的抽象命名。变量名就是你抽象出来的某块空间的别名。指针就是地址。指向某个地址。 指针...
    99+
    2024-04-02
  • C语言 - 结构体、结构体数组、结构体指针和结构体嵌套
    结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(name) :char [ ] 型性别(sex):c...
    99+
    2023-08-30
    c语言 开发语言
  • C#结构体指针的用法
    本篇内容介绍了“C#结构体指针的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#语言有很多值得学习的地方,这里我们主要介绍C#解析结构...
    99+
    2023-06-17
  • C语言结构体指针的示例分析
    这篇文章给大家分享的是有关C语言结构体指针的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。写结构体指针前,先说一下 . 号和 -> 的区别记得当初刚学C语言的...
    99+
    2023-06-20
  • c语言结构体指针如何使用
    在C语言中,我们可以使用指针来操作结构体变量。首先,我们需要定义一个结构体类型,然后声明一个结构体变量。接下来,我们可以使用指针来操...
    99+
    2023-10-28
    c语言
  • C语言中结构体和共用体的示例分析
    这篇文章给大家分享的是有关C语言中结构体和共用体的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、实验目的掌握结构体类型变量的定义和使用;掌握结构体类型数组的概念和应用;掌握链表的概念,初步学会对链表进...
    99+
    2023-06-20
  • C语言结构体指针的具体使用
    目录什么是结构体指针?如何访问结构体成员?如何传递结构体指针作为参数?结构体指针数组在 C语言中,结构体指针是一种非常有用的数据类型,它可以让我们更方便地操作结构体。结构体指针可以指...
    99+
    2023-05-20
    C语言结构体指针
  • C语言中结构体和共用体如何使用
    本篇文章给大家分享的是有关C语言中结构体和共用体如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。结构体 / struct结构体的定义声明一个结构体类型的一般形式为:str...
    99+
    2023-06-16
  • C语言结构体指针案例解析
    写结构体指针前,先说一下 . 号和 -> 的区别 记得当初刚学C语言的时候,搞不清结构体的 . 号和 -> ,经常混淆二...
    99+
    2024-04-02
  • c# 如何使用结构体实现共用体
    目录理解 C 语言的共用体使用 C# 实现共用体共用体作为另一个共用体的成员在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的...
    99+
    2024-04-02
  • C#结构体构造函数的实例分析
    这期内容当中小编将会给大家带来有关C#结构体构造函数的实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#结构体构造函数的应用是如何的呢?C#结构体构造函数的实例1、  &nbs...
    99+
    2023-06-18
  • C++结构体字节对齐和共用体大小的示例分析
    这篇文章主要介绍了C++结构体字节对齐和共用体大小的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、结构体内存对齐结构体内存对齐在笔试和面试中经常被问到,所以做个总...
    99+
    2023-06-25
  • C语言结构体指针引用详解
    目录指向结构体变量的指针指向结构体数组的指针结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。 指向结构体变量的指针 前面我们通过“结构体变量名.成员名”的方式引用结构...
    99+
    2024-04-02
  • C语言结构体指针怎么引用
    这篇文章主要介绍“C语言结构体指针怎么引用”,在日常操作中,相信很多人在C语言结构体指针怎么引用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言结构体指针怎么引用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-25
  • C#中怎么定义结构体指针
    本篇文章为大家展示了C#中怎么定义结构体指针,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#结构体指针之C#结构体的定义:[StructLayout(LayoutKind.Sequential)]...
    99+
    2023-06-18
  • C++结构体字节对齐和共用体大小
    目录1、结构体内存对齐2、共用体的内存大小3、枚举的大小1、结构体内存对齐 结构体内存对齐在笔试和面试中经常被问到,所以做个总结 通过代码验证不同结构体的内存大小: #inclu...
    99+
    2024-04-02
  • C#中如何使用结构体构造函数
    本篇文章给大家分享的是有关C#中如何使用结构体构造函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。///〈summary〉  ///启动服务端的参数结构&...
    99+
    2023-06-17
  • C#调用带结构体指针Dll的方法
    在C#中调用C(C++)类的DLL的时候,有时候C的接口函数包含很多参数,而且有的时候这些参数有可能是个结构体,而且有可能是结构体指针,那么在C#到底该如何安全的调用这样的DLL接口...
    99+
    2024-04-02
  • C语言中结构体和共用体实例教程
    目录一、实验目的二、实验内容三、实验记录3.1 候选人选票统计3.2 print函数3.3 链表总结一、实验目的 掌握结构体类型变量的定义和使用; 掌握结构体类型...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作