Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

構造体へのポインタの動的メモリ割り当てをC言語で説明する


構造体へのポインタは、構造体全体の追加を保持します。

リンクリスト、ツリー、グラフなどの複雑なデータ構造を作成するために使用されます。

構造体のメンバーには、矢印演算子(->)と呼ばれる特別な演算子を使用してアクセスできます。

宣言

以下は、Cプログラミングの構造体へのポインタの宣言です-

struct tagname *ptr;

例:struct student * s;

アクセス

構造体へのポインタにアクセスする方法については、以下で説明します。

Ptr-> membername;

例-s->sno、s-> sname、s-> mark;

以下は、Cプログラミングにおける構造体の動的メモリ割り当てを説明するCプログラムです-

#include <stdio.h>
#include <stdlib.h>
struct person {
   int age;
   float weight;
   char name[30];
};
int main(){
   struct person *ptr;
   int i, n;
   printf("Enter the number of persons: ");
   scanf("%d", &n);
   // allocating memory for n numbers of struct person
   ptr = (struct person*) malloc(n * sizeof(struct person));
   for(i = 0; i < n; ++i){
      printf("Enter name and age respectively: ");
      // To access members of 1st struct person,
      // ptr->name and ptr->age is used
      // To access members of 2nd struct person,
      // (ptr+1)->name and (ptr+1)->age is used
      scanf("%s %d", (ptr+i)->name, &(ptr+i)->age);
   }
   printf("Displaying Information:\n");
   for(i = 0; i < n; ++i)
      printf("Name: %s\tAge: %d\n", (ptr+i)->name, (ptr+i)->age);
   return 0;
}

出力

上記のプログラムを実行すると、次の結果が得られます-

Enter the number of persons: 1
Enter name and age respectively: bhanu 24
Displaying Information:
Name: bhanu Age: 24

例2

ポインタと構造に関する別の例を考えてみましょう。ここでは、ポインタと構造を示すCプログラムが提供されています。

#include<stdio.h>
//Declaring outer and inter structures//
struct Manager{
   char Name[15];
   int Age;
   char Gender;
   float Level;
   char Role[50];
   char temp;
}m[20];
void main(){
   //Declaring variable for For loop and pointer variable//
   int i;
   struct Manager *p;
   //Defining Pointer//
   p=&m;
   //Reading User I/p//
   for (i=1;i<3;i++){//Declaring function to accept 2 manager's data//
      printf("Enter the Name of manager %d : ",i);
      gets(p->Name);
      printf("Enter the Age of manager %d : ",i);
      scanf("%d",&p->Age);
      scanf("%c",&p->temp);//Clearing Buffer//
      printf("Enter the Gender of manager %d : ",i);
      scanf("%c",&p->Gender);
      //scanf("%c",&p->temp);//Clearing Buffer//
      printf("Enter the level of manager %d : ",i);
      scanf("%f",&p->Level);
      scanf("%c",&p->temp);//Clearing Buffer//
      printf("Enter the role of manager %d : ",i);
      gets(p->Role);
      p++;
   }
   //Defining Pointer one more time to print output//
   p=&m;
   //Printing O/p//
   for (i=1;i<3;i++){
      printf("The Name of Manager %d is : %s\n",i,p->Name);
      printf("The Age of Manager %d is : %d\n",i,p->Age);
      printf("The Gender of Manager %d is : %c\n",i,p->Gender);
      printf("The Level of Manager %d is : %f\n",i,p->Level);
      printf("The Role of Manager %d is : %s\n",i,p->Role);
      p++;
   }
}

出力

上記のプログラムを実行すると、次の結果が得られます-

Enter the Name of manager 1 : Hari
Enter the Age of manager 1 : 55
Enter the Gender of manager 1 : M
Enter the level of manager 1 : 2
Enter the role of manager 1 : Senior
Enter the Name of manager 2 : Bob
Enter the Age of manager 2 : 60
Enter the Gender of manager 2 : M
Enter the level of manager 2 : 1
Enter the role of manager 2 : CEO
The Name of Manager 1 is : Hari
The Age of Manager 1 is : 55
The Gender of Manager 1 is : M
The Level of Manager 1 is : 2.000000
The Role of Manager 1 is : Senior
The Name of Manager 2 is : Bob
The Age of Manager 2 is : 60
The Gender of Manager 2 is : M
The Level of Manager 2 is : 1.000000
The Role of Manager 2 is : CEO

  1. ユニオンにC言語でのポインタを説明する

    ユニオンはメモリロケーションと呼ばれ、さまざまなデータ型のいくつかの変数によって共有されます。 構文 構文は次のとおりです- union uniontag{    datatype member 1;    datatype member 2;    ----    ----    datatype member n; }; たとえば、 union sample{    int a;    float b;    char c; }

  2. C言語でのポインタアクセスの概念を説明する

    ポインタは、他の変数のアドレスを格納する変数です。 ポインタの宣言、初期化、アクセス 次のステートメントを検討してください- int qty = 179; ポインタの宣言 int *p; 「p」は、別の整数変数のアドレスを保持するポインタ変数です。 ポインタの初期化 アドレス演算子(&)は、ポインタ変数を初期化するために使用されます。 int qty = 175; int *p; p= &qty; 文字列の配列内の要素にアクセスする際にポインタがどのように役立つかの例を考えてみましょう。 このプログラムでは、特定の場所に存在する要素にアクセスしようとしています。操