精华内容
下载资源
问答
  • } 三、typedef 关于typedef,一个关于函数指针,一个关于结构体 关于函数指针 #include typedef int (*fun)(int i, int j) ; //定义一个函数指针新类型fun,返回值为int,参数有2个整型参数 int add(int a, int b) {...

    d8f1303b1f50bf9d6195af3347fd6de2.png

    一、共用体

    共用体和结构体有些类似,它们都有多个数据成员。不同的是,结构体的多个数据成员是各自独立分别存放的。

    而共用体的多个数据成员却是保存在内存中的同一个位置,它们“共用”一段内存资源,所以被称为“共用体”。

    同结构体变量一样,也可以通过“.”引用共用体的数据成员。

    注意:共用体的各个数据成员共用同一内存资源,如果将共用体某一数据成员修改后,它所在的内存的值会发生变化,相应的这个共用体的其它数据成员也会发生变化。

    二、枚举

    C语言中的枚举类型,其实质是就是一个Int类型的数据。而所谓的枚举值,不过就是给一些位于某个范围内的整数值(由编译器给定或者程序员在代码中给定)一个容易记忆和使用的标识符(名字)。使用这个有意义的名字给变量赋值,在一定程度上可以提高代码的可读性。

    enum  TraficLight
    {
    Green=1, //给定枚举值
    Rea,
    Yellow
    };
    Int main()
    {
    enum TraficLight  light;
    Light = red;  //为枚举类型赋值
    return 0;
    }
    枚举值通常表达的是某一个范围内的有限的可选值,且枚举值可以作为常量使用,所以往往使用枚举值来作为switch语句的分支条件,表达对某一范围内的不同情况的处理。
    switch(light)
    {
    case red:  break;
    case yellow:break;
    case green:break;
    }

    枚举类型的意义在于提高程序代码的可读性。

    举例:关于交通灯枚举编程题目

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    enum TraficLight {
     red, green, yellow
    };
    int main()
    {
     enum TraficLight  light;
     srand(time(NULL));
     int num = rand()%3;
     light =(TraficLight)num;
     switch(light)
     {
      case red : printf("目前是红灯,禁止通行n");break;
      case green: printf("目前是绿灯,可以通行n");break;
      case yellow:printf("目前是黄灯,快速通行n");break;
     }
      return 0;
    }

    三、typedef

    关于typedef,一个关于函数指针,一个关于结构体

    关于函数指针

    #include <stdio.h>
    typedef int (*fun)(int i, int j) ;  //定义一个函数指针新类型fun,返回值为int,参数有2个整型参数
    int add(int a, int b)
    { return a+b; } 
     int sub(int a, int b)
     {  return b-a; }
      int main()
     {  int a,b; fun  f1;
      printf("input a,b:n");
      scanf("%d%d",&a,&b);
       if(a>b) 
      {  f1=add;
       printf("%d+%d=%dn",a,b,f1(a,b));
      }
      else
      {   f1=sub;
       printf("%d-%d=%dn",b,a,f1(a,b));  
      }   
      return 0; }

    关于结构体

    #include <stdio.h>
    typedef struct Student
    { int num;
     char name[20];
     float score;
    } Stu;
    int main()
    {
     Stu s[3]={{1,"er",89},{2,"sd",67},{3,"we",86}},*p;
     int i;
     for(i=0;i<3;i++)
     {
      printf("学号:%dt姓名:%st分数:%fn",s[i].num,s[i].name,s[i].score);
     }
      for(p=s;p<s+3;p++)
      printf("学号:%dt姓名:%st分数:%fn",p->num,p->name,p->score);
     
      return 0;
    }
     
    展开全文
  • 同样联合变量也可以定义成数组或指针,但定义为指针时,也要用->符号, 此时联合访问成员可表示成: 联合名->成员名 另外, 联合既可以出现在结构内, 它的成员也可以是结构。 例如: struct { int age; char *addr; union ...

    4177e337b9b34518187b3a8c6603c945.png

    联合与枚举很多小伙伴老是搞混了,这次记下来,与大家分享,希望大家能够有所收获。

    enum是枚举型

    union是联合型,共用体,成员共用一个变量缓冲区 现在基本已经不用了。

    枚举类型

    在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。

    1.1 枚举类型的定义和枚举变量的说明

    1. 枚举的定义枚举类型定义的一般形式为: enum 枚举名{ 枚举值表 };

    在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。

    2. 枚举变量的说明

    如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。

    设有变量a,b,c被说明为weekday,可采用下述任一种方式:

    enum weekday{ sun,mou,tue,wed,thu,fri,sat };

    enum weekday a,b,c;

    或者为:

    enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;

    或者为:

    enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;

    文章福利

    2fecd5af481d6e2cdefb173a40863406.png

    领取方式:

    C/C++项目领取jq.qq.com

    1.2 枚举类型变量的赋值和使用 枚举类型在使用中有以下规定:

    1. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。

    例如对枚举weekday的元素再作以下赋值: sun=5; mon=2; sun=mon; 都是错误的。

    2. 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。

    如在weekday中,sun值为0,mon值为1,…,sat值为6。

    【例】 main(){

    enum weekday

    { sun,mon,tue,wed,thu,fri,sat } a,b,c;

    a=sun; b=mon; c=tue;

    printf("%d,%d,%d",a,b,c); }

    说明:

    只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如: a=sum; b=mon; 是正确的。而: a=0; b=1;

    是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。 如:

    a=(enum weekday)2;

    其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:

    a=tue;

    还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。

    【例】

    main(){

    enum body { a,b,c,d } month[31],j;

    int i;

    j=a;

    for(i=1;i<=30;i++){

    month[i]=j;

    j++;

    if (j>d) j=a;

    }

    for(i=1;i<=30;i++){

    switch(month[i])

    {

    case a:printf(" %2d %ct",i,'a'); break;

    case b:printf(" %2d %ct",i,'b'); break;

    case c:printf(" %2d %ct",i,'c'); break;

    case d:printf(" %2d %ct",i,'d'); break;

    default:break;

    }

    }

    printf("n");

    33abaadaccf5fa812928f6cdf15e284c.png

    联合(union):

    一、联合说明和联合变量定义

      联合也是一种新的数据类型, 它是一种特殊形式的变量。

      联合说明和联合变量定义与结构十分相似。其形式为:

      union 联合名

      {

        数据类型 成员名;

        数据类型 成员名;

        ...

      }联合变量名;

    联合表示几个变量公用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。

    下例表示说明一个联合a_bc:

      union a_bc

      {

        int i;

        char mm;

      };

    再用已说明的联合可定义联合变量。

    例如用上面说明的联合定义一个名为lgc的联合变量,可写成:

    union a_bc lgc;

    在联合变量lgc中, 整型量i和字符mm公用同一内存位置。

    当一个联合被说明时, 编译程序自动地产生一个变量,其长度为联合中最大的变量长度。

    联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时,也要用->符号, 此时联合访问成员可表示成:

      联合名->成员名

    另外, 联合既可以出现在结构内, 它的成员也可以是结构。

    例如:

    struct

    {

      int age;

      char *addr;

      union

      {

        int i;

        char *ch;

      }x;

    }y[10];

    若要访问结构变量y[1]中联合x的成员i, 可以写成:

      y[1].x.i;

    若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:

      *y[2].x.ch;

    若写成y[2].x.*ch;是错误的。

    学习C/C++编程知识,提升C/C++编程能力,欢迎关注专栏:

    C/C++编程学习聚集地zhuanlan.zhihu.com
    7c96cdc92eb9312507123a37d8b17ac0.png
    展开全文
  • 指针如何赋值?关于指针的理解

    千次阅读 2019-10-12 23:17:46
    今天班上的一个学霸在学习数据结构的字符串的时候遇到了一个问题,这个问题就是他在写代码的时候,不管怎么样Main方法里就是不能够给指针赋值,就算赋值了好像指针里啥都没有,更别说使用其他函数了。 首先声明一下...
    数据结构文章推荐:
    👉 顺序表和链表实现图书管理系统
    👉 多种方式实现英文单词词频统计和检索系统
    👉 深度优先搜索判断有向图路径是否存在
    👉 待更新

    ——关于指针的一个问题

           今天班上的一位学霸在学习数据结构的字符串的时候遇到了一个问题,这个问题就是他在写代码的时候,不管怎么样主函数里就是不能够给指针赋值,就算赋值了好像指针里啥都没有,更别说使用其他函数了。
           首先声明一下:这个问题其实并不难,个人认为这个问题只要简单的认识两个点——指针到底是什么?指针到底怎么用?就可以搞懂这个问题了!接下来我会用我认为最简单的思路为有疑惑的同学一步步的讲解,希望各位有耐心的看完,谢谢!!!
           话不多说,我模拟了一下当时重要部分的代码,具体如下:

    void output(char *chars){
        int i = 0;
        while(chars[i]!='\0'){
            printf("%c",chars[i]);
            i++;
        }
    }
    int main(){
        //char chars[] = "abcdefg";
        char *chars;
        int i = 0;
        while(scanf("%c",&chars[i++])!='\0'){}
        output(chars);
        return 0;
    }
    

    代码分析

           1、从上述代码可以看出,output中的一个参数是char的指针,output这个函数目的就是简单的输出一下指针里的东西。
           2、主函数中定义了一个名字为chars的字符串指针,并且主函数中试图利用循环对指针进行赋值
           3、主函数对名为chars的指针赋值完毕之后,最后调用output函数将指针的值输出。
           没错,你没有看错,就是这么简单的代码!好了,最上述代码的具体功能分析已经结束。


    问题分析 & 问题解决

           我们再看一下问题:主函数不能给chars这个指针赋值,在运行的时候就是输入一串字符之后就中止进程了,就像这样?:
    问题的错误情况
           那么这种问题为什么会出现?其实仔细看代码,其他地方实际上都没有写错,就是这个chars怎么看都不顺眼(实际上当时不是while循环是for循环,当时for循环也有一点小问题,所以这里写成了while)
           当时是指针的错误,但是我没有急着说,我在想什么同学会这样写——主函数中有一个chars的指针,output函数中的参数也为chars指针。没错,许多人都有个习惯,那就是认为主函数中要调用自定义函数,那么传过去东西的也必须是和自定义函数一样的(都是指针)!这是我的同学犯错的原因之一。
           不急着矫正错误,如果顺着其思路走下去,其实想法是没错的。因为在学数据结构的时候有个顺序表,顺序表中有个内容是这样的?:

    第一部分
    //顺序表数据结构
    typedef struct SqList{
        Book *elem;   //储存空间的基地址
        int length;   //数据结构的长度
    };
    
    第二部分:
    //初始化顺序表基本算法
    Status InitList(SqList &BookSystem){
        //构造一个空的顺序表BookSystem
        BookSystem.elem =  new Book[maxsize];   //分配内存空间
        if(!BookSystem.elem)exit(-1);   //存储分配失败
        BookSystem.length = 0;  //当前长度为0
        return OK;
    }
    
    第三部分:
    //添加6本图书
    void insertBook(SqList &BookSystem){
        int i = 0;  //循环变量
        for(i;i<6;i++){
        	int index = i;
            Book newBook;
            scanf("%s %s %s %s %s %f",&newBook.isbn,&newBook.authorName,
                      &newBook.bookName,&newBook.publisher,
                      &newBook.publishYear,&newBook.price);
            BookSystem.elem[index] = newBook;
        }
    }
    

           当时他说有个地方搞不清,就是结构体中的elem也是个指针,在insertBook函数中也可以用下标形式给指针赋值,所以就按照这个思路写了他的代码。
           乍一看好像也对,但仔细看看就不对了,我相信我的同学没有仔细揣摩为什么要有第二部分,而是直接照着第一部分第三部分写了代码。没有理解到初始化指针的作用,这也是我的同学犯错的原因之二。


    问题解决之指针到底是什么?指针的作用方式?

           知道了错误之后,就要纠正错误,纠正错误就从两点搞起:1、指针到底是个啥?2、指针到底咋个用?——接下来就以我自己的想法和大家说一说,也许就能解决大家的疑惑了!
           首先,指针是个啥?我们都知道指针这东西很重要,这东西就想骇客手里的工具一样,“指”到你的设备,就能入侵你的设备并且还能扒取并修改你设备里的信息,但如果不去“指”,这个工具就缺少了入侵别人设备的途径,也就不能对别人的设备为所欲为了。
           上面已经说了指针必须得指到一个东西才能改那个东西。那么看上面代码可以知道,光定义了一个指针,但是没把任何东西的地址给那个指针,那还怎么能给那个指针赋值呢?这就是犯错的第二个原因,没有初始化指针!
           这里继续强调一下第二个代码示例中的第二部分,第二部分中将Book数组的首元素地址给了elem指针,所以才能执行第三部分的添加图书的操作的?

    BookSystem.elem =  new Book[maxsize];   //分配内存空间
    

           好了,到了这里肯定有人会认为:给主函数里的那个指针一个被指的东西不就好了?就像这样?:

    int main(){
    	char shuzu[] = "abcdefg";
        char *chars = shuzu;
        int i = 0;
        while(scanf("%c",&chars[i++])!='\0'){}
        output(chars);
        return 0;
    }
    

           确实,给一个字符数组让指针去指,就可以通过指针给数组赋值了。但还是有一个问题——主函数中调用output函数时传的是指针吗?显而易见,肯定不是,与上面所说的一样,指针通过指向某个值之后再去获取或修改那个值。再看下面的代码?:

    void output(char *chars){
        //输出数组内容...
    }
    int main(){
    	//代码略...
        output(chars);
        return 0;
    }
    

           主函数传了个指针chars给output函数,output函数接收到chars之后,chars指向了chars然后执行输出操作,两者都是指针。听着是不是很乱?还记得我说的犯错的原因之一是什么吗?就是取了相同的名字所以容易让人混淆!
           我们将主函数中的chars改个名?:

    void output(char *chars){
        //输出数组内容...
    }
    int main(){
    	char shuzu[] = "abcdefg";
        char *c = shuzu;
        int i = 0;
        while(scanf("%c",&c[i++])!='\0'){}
        output(c);
        return 0;
    }
    

           output函数接收到c之后,chars指向了c,如果说chars要取数组的内容那么是这样的:指针chars去找指针c中所指的数组的元素。不管怎么样,这样也太麻烦了。我们直接传数组过去让chars指不就好了吗?这样的话主函数就不用再写什么指针,老老实实写个数组再传就OK了!

    int main(){
    	char shuzu[] = "abcdefg";
        scanf("%s",&shuzu);
        output(shuzu);
        return 0;
    }
    

           OK,问题解决!

    问题总结

           我当时看到这个问题的时候,第一眼看过去好像还真是那么回事,从上述的代码分析也可以看出,其实这些代码要干什么我们都懂,但我的那位同学就是遇到了这个‘简单’的问题。
           为什么说这个问题是个‘简单’的问题?还是文章开头所说:这个问题其实并不难,个人认为这个问题只要简单的认识指针到底是什么?指针到底怎么用?就可以搞懂这个问题了!
           本人水平有限,我认为写一些能给大家帮助的文章非常有必要,同时巩固自己的思想,我认为逻辑思考能力十分重要,希望一些平时有很多疑惑的朋友务必要有思考的精神!
           最后,如果大家觉得本文有帮助,记得支持一下哦!大二菜鸟欢迎交流!

    展开全文
  • 帮忙看一下这段代码,有什么错误啊? char *sname[]={}; int k=0; for(i=0;i<20;i++) { char name[128]=""; name=get_name();//这个函数是获得字符串name的 sname[k++]=(char *)malloc(512);...}
  • 怎么给 智能指针 直接赋值? 比如 : CComPtr<Itest>TT = 0x12345678;//就是这个意思 谢谢。
  • 文章目录1.C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *' 1.C语言 结构体指针赋值 incompatible types when assigning to type ‘char[20]’ from type ‘char *...

    1.C语言 结构体指针赋值 incompatible types when assigning to type ‘char[20]’ from type ‘char *’

    • strcpy(pstudent->name, "guo zhao wei ");
      为什么错误,该怎么写,(红色行)

    • 追问
      为什么不能直接赋值啊,

    • 追答

    用char nnnn[20]定义的,用strcpy 
    用char *ppp定义的,用=来赋值
    

    参考:C语言 结构体指针赋值 incompatible types when assigning to type ‘char[20]’ from type 'char *’

    如果实在理解不了,请看:用结构体指针前必须要用malloc,不然会出现段错误

    展开全文
  • 有两个指针数组,char *A[10] , char ...为什么这个函数执行完了之后,B中保存的数据怎么不是函数执行前的数据呢。 有什么方法能够使执行完函数之后,B中保存的数据还是执行前的数据? 谢谢,,个位大神了!!帮帮忙!
  • 同函数内的变量赋值正常。一赋值给全局变量就出错了 type PProcedure = ^TProcedure; var g1: TProcedure; function ......... var t1: TProcedure; p1: PProcedure; begin ..... t1 := p1^;...
  • 那么如果我不利用c++的赋值兼容规则,而是通过将public派生类对象地址强制转换为基类指针赋值给基类指针变量会是怎么样的一个结果呢?  例如: #include "stdafx.h" #include using namespace std; class ...
  • //这种赋值方式符合规范吗? puts(p1); //正常输出abcdefg puts(p2); //正常输出hijklmn p1[2] = p2[2]; puts(p1); //输出abjdefg p2[3] = p1[3]; puts(p2); //无法输出,程序在上一条语句终止,且不报错 ``...
  • 现需要对上面注释的左轮轮廓曲线、右轮轮廓曲线 进行赋值赋值的数据是一列 x坐标和 一列y坐标 就假设 X坐标为0,1,2,3,4,5, Y坐标为10,20,30,40,50,60 请各位大神不吝赐教,感激不尽!!!
  • 请问各位大佬,函数指针赋值很容易,但是当函数的参数不确定时该怎么赋值?如图是定参数时没问题,但是当函数指针改为不定参数的时候就报错,不能传入,请问能否将一个定参数的函数传给一个不定参数的函数指针?...
  • 下面是gdb调试结果, 注意看p ©Config->roleDefine 显示地址是 0x3116030,赋值给引用后(const RoleDefineVector *) 0x311602c,赋值前后值竟然变化了, 这是怎么回事呢?求大侠指教 296 if ( !copyConfig) { ...
  • 注: DEV_EVENT_TRAFFIC_MANUALSNAP_INFO是一个结构,pAlarmInfo是个指针,现在的问题是怎么把这个指针赋值给一个结构? 还是我翻译的不对? 附C++源码: int CALLBACK AnalyzerDataCallBack(LONG ...
  • 前面的文章已经提出了一个关键点,两个unique_ptr智能指针之间无法进行值传递,但是明显很多时候需要多个指针管理同一个内存。这个时候shared_ptr就应运而生了。 每种智能指针都是以类模板的方式实现的,shared_ptr...
  • 以下为源码,我照着一本C语言教材打的,定义了两个求较小的数的指针函数,但是输出的值总是很大的数字,而且和赋的值无关,请问这是怎么回事? #include "pch.h" #include int main() { int * minp(int *...
  • 问题:赋值后,p指针指向的内存地址和&(pFather->m_HddBaseInfo)地址及(pFather->m_HddBaseInfo.strSerialNumber)的地址不一样(偏移了7个字节或15个字节)!导致memcpy失败!会是怎么的情形导致赋值操作都会发生...
  • 待定...
  • #define M 25 #define N 25 int array[M][N]; int i, j; void Rand(int *p, int n) { p = &array[0][0]; for(i = 0;i;i++ { *(p + i) = rand()%100;...这是一维指针,要求是二维,怎么
  • 比如 char *s1; s1="hello"; 这样把字符串首字符h的地址赋给字符指针变量 之后s1++运算后 如果s1指向o的地址之后 怎么初始化使s1重新指向h的地址
  • 结构体指针地址没变,值被篡改了什么情况,有没有大神知道啊 // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include "string.h" using ...
  • 自从学了c之后,还没怎么用过二维指针,这么算是记住了 /* c语言实现函数给主函数中的指针赋值的方法 */ #include void f (int **p); int main (){ int * a ; a = NULL ; f (&a); printf("%d",*a); free(a...
  • c中给字符数组,字符串指针赋值的方法总结

    万次阅读 多人点赞 2018-01-12 10:22:48
    怎么给这个数组赋值呢?谭浩强的书上明确指出,字符数组可以在定义时整体赋值,不能再赋值语句中整体赋值。 1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10]; a[10...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 622
精华内容 248
关键字:

指针怎么赋值