为什么结构体一般定义成指针变量?

#include<stdlib.h>
#include<string.h>
#define MAX 16
typedef struct
{
    int data[MAX];
    int length;
}SqList;
void init(SqList *L)
{
    SqList *L2;
    int i = 0;
    L2 = (SqList *)malloc(sizeof(SqList));
    L2->length = 10;
    for (; i < L2->length; i++)
    {
        L2->data[i] = 97;
    }
    *L = *L2;

}
void display(SqList L)
{
    int i = 0;
    for (; i<L.length; i++){
        printf("%d ", L.data[i]);
    }

}
//******************************************
//参数传入为指针变量的地址
void init2(SqList **L)
{
    int i = 0;
    // 返回分配给结构的首地址,把它存储到指针变量中
    *L = (SqList *)malloc(sizeof(SqList));
    (*L)->length = 10;
    for (; i < (**L).length; i++)
    {
        (*L)->data[i] = 12;
    }

}

void display2(SqList *L)
{
    int i = 0;
    for (; i<L->length; i++){
        printf("%d ", L->data[i]);
    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    SqList L;
    init(&L);
    display(L);
    printf("\n");
    SqList* pL;
    init2(&pL);
    display2(pL);

    return 0;
}

如果结构体不定义成指针变量,初始化的时候需要么直接初始化,如果使用init函数初始化,会再次申请一个结构体空间。降低效率。

所以最好用指针。

初始化结构体有2种方式,还可以把结构定义成全局变量,这样无需malloc分配空间。但是一般不要使用全局变量,所以

    SqList* pL;
    init2(&pL);
    display2(pL);

是最好的。

时间: 2024-08-20 00:29:30

为什么结构体一般定义成指针变量?的相关文章

结构体中定义函数指针

转自:http://blog.csdn.net/unix21/article/details/9293877 结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n }; 形式2:在定义类型的同时定义变量 struct结构体标识符 { 成员变量列表;… } *指针变量名;

&lt;22&gt;【掌握】指针变量概念及定义方法+【理解】两变量值交换的方法+【掌握】总结*使用场合

[掌握]指针变量概念及定义方法 1.指针变量 用来存放地址的变量,就是指针变量 2.指针? 就是地址,地址是个常量 3.指针变量的定义 数据类型 *指针变量名; int *p; //定义了一个指针变量,变量名是p //int表示,p只能存放一个int类型的变量的地址 char *p1; //定义了一个指针变量,变量名是p1 //p1只能存放一个char类型数变量的地址 int num=10; char *p = &num; //警告 4.指针变量定义的注意事项 1)“*” 必须得有,如果没有就相

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值

[日常] C语言中指针变量

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址.编译和链接过程的一项重要任务就是找到这些名称所对应的地址. #include <stdio.h> //指针变量测试 //指针变量存储的值是另一个变量的地址,也就是说改指针变量指向了另一个变量 int main(){ int a=10; int c=20; //1.打印出变量的内存地址 printf("%#X \n",(unsig

C语言---指针变量详解1

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量.在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是数组.字符串.函数,也可以是另外的一个普通变量或指针变量. 现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示).另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们

黑马程序员---C基础9【字符串的输入输出】【字符串相关函数】【指针】【指针变量初始】【二级指针】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [字符串的输入输出] 1.字符串输出: %s-------从给定的地址开始输出字符直到遇到\0停止: printf("%s\n",&a[3]);  printf("%s\n",a); char a[]="hellowo\0rd!"; 2.字符串输入: 从键盘上接收一个字符串,保存在以a为首地址的字符数组中 scanf("%s&

4.6指针变量作参数

Q:编写一个函数,该函数被主函数调用,通过该函数实现向主函数中定义的数组输入数据. 注意:函数的调用是在内存的堆栈中实现的.一旦函数调用结束,该函数内部的所有局部变量都会被释放掉. 本题目要求对主函数中的数组值进行修改,所以无法通过函数的返回值来实现该功能.要想通过被调函数修改主函数的数组值,只能将数组的首地址(指针)作为函数的参数进行传递,被调函数通过主函数传递来的数组首地址(指针)对数组的内容进行修改. #include<iostream> #include<cstdio> u

辨析函数指针变量和指针型函数

在上一篇随笔(顺序表基本操作算法的代码实现)中,LocateElem()函数的第三个形参的形式是: Status (*compare)(Elemtype e,Elemtype temp); 这是一个函数指针变量,借此机会记录一下函数指针变量和指针型函数的区别. 一.写法上的区别 函数指针变量 指针型函数 int (*function)(int i); int  *function(int i){} 上面是一个例子,可看到函数指针变量只是在:*function处比指针型函数多了一对小括号,下面是两

C/C++ 什么是指针变量

定义一个指针变量 指针变量的使用如 int c = 76; int * pointer = &c; 则 *pointer 为 pointer 所指向的存储单元的内容,是变量C而不是数字76 另:指针变量也是变量,是变量就有地址.