Passing Structures to Functions in C: Usage and Examples

Rumman Ansari   Software Engineer   2024-07-05 03:53:50   9696  Share
Subject Syllabus DetailsSubject Details
☰ TContent
☰Fullscreen

Passing Structures to Functions

This section discusses passing structures and their members to functions. A structure can be passed to any function from the main function or from any subfunction. Structure definition will be available within the function only. It won’t be available to other functions unless it is passed to those functions by value or by address(reference). Else, we have to declare structure variable as a global variable. That means structure variable should be declared outside the main function. So, this structure will be visible to all the functions in a C program.

Passing Structure Members to Functions

When you pass a member of a structure to a function, you are passing the value of that member to the function. It is irrelevant that the value is obtained from a member of a structure. For example, consider this structure:

 struct structName
{
char p;
int q;
float r;
char s[10];
} record1;

Here are examples of each member being passed to a function:

func(record1.p); /* passes character value of p */
func2(record1.q); /* passes integer value of q */
func3(record1.r); /* passes float value of r */
func4(record1.s); /* passes address of string s */
func(record1.s[2]); /* passes character value of s[2] */
 

Example Program

<span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">/* Define a structure type. */</span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> struct_type </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> p</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">char</span><span class="pln"> q</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> f1</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> item</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">struct</span><span class="pln"> struct_type record1</span><span class="pun">;</span><span class="pln">
	record1</span><span class="pun">.</span><span class="pln">p </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
	f1</span><span class="pun">(</span><span class="pln">record1</span><span class="pun">.</span><span class="pln">p</span><span class="pun">);</span><span class="pln"> </span><span class="com">/* passes character value of p */</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> f1</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> item</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	printf</span><span class="pun">(</span><span class="str">"%d \n"</span><span class="pun">,</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span>

Output

10
Press any key to continue . . .

In each case, it is the value of a specific element that is passed to the function. It does not matter that the element is part of a larger unit.

If you wish to pass the address of an individual structure member, put the & operator before the structure name. For example, to pass the address of the members of the structure record1, write

func(&record1.p); /* passes address of character p */
func2(&record1.q); /* passes address of integer q */
func3(&record1.r); /* passes address of float r */
func4(record1.s); /* passes address of string s */
func(&record1.s[2]); /* passes address of character s[2] */
 

Example Program

<span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">/* Define a structure type. */</span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> struct_type </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> p</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">char</span><span class="pln"> q</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> f1</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> </span><span class="pun">*</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">struct</span><span class="pln"> struct_type record1</span><span class="pun">;</span><span class="pln">
	record1</span><span class="pun">.</span><span class="pln">p </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
	f1</span><span class="pun">(&amp;</span><span class="pln">record1</span><span class="pun">.</span><span class="pln">p</span><span class="pun">);</span><span class="pln"> </span><span class="com">/* passes address of character p */</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> f1</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> </span><span class="pun">*</span><span class="pln">item</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	printf</span><span class="pun">(</span><span class="str">"%d \n"</span><span class="pun">,*</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span>

Output

10
Press any key to continue . . .

Assign structure to a function by value

<span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;string.h&gt;</span><span class="pln">

</span><span class="kwd">struct</span><span class="pln"> student 
</span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">int</span><span class="pln"> id</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">char</span><span class="pln"> name</span><span class="pun">[</span><span class="lit">20</span><span class="pun">];</span><span class="pln">
 </span><span class="kwd">float</span><span class="pln"> percentage</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> func</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> student stu1</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln"> 
</span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">struct</span><span class="pln"> student stu1</span><span class="pun">;</span><span class="pln">

 stu1</span><span class="pun">.</span><span class="pln">id</span><span class="pun">=</span><span class="lit">21</span><span class="pun">;</span><span class="pln">
 strcpy</span><span class="pun">(</span><span class="pln">stu1</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Rambo"</span><span class="pun">);</span><span class="pln">
 stu1</span><span class="pun">.</span><span class="pln">percentage </span><span class="pun">=</span><span class="pln"> </span><span class="lit">96.5</span><span class="pun">;</span><span class="pln">

 func</span><span class="pun">(</span><span class="pln">stu1</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> func</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> student stu1</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
 printf</span><span class="pun">(</span><span class="str">" Id is: %d \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">.</span><span class="pln">id</span><span class="pun">);</span><span class="pln">
 printf</span><span class="pun">(</span><span class="str">" Name is: %s \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">.</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
 printf</span><span class="pun">(</span><span class="str">" Percentage is: %f \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">.</span><span class="pln">percentage</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span>
 Id is: 21
 Name is: Rambo
 Percentage is: 96.500000
Press any key to continue . . .

Passing structure to a function by address(reference)

In this program, the whole structure is passed to another function by address. It means only the address of the structure is passed to another function. The whole structure is not passed to another function with all members and their values. So, this structure can be accessed from called function by its address.

<span class="pln">
 </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;string.h&gt;</span><span class="pln">
 
</span><span class="kwd">struct</span><span class="pln"> student 
</span><span class="pun">{</span><span class="pln">
           </span><span class="kwd">int</span><span class="pln"> id</span><span class="pun">;</span><span class="pln">
           </span><span class="kwd">char</span><span class="pln"> name</span><span class="pun">[</span><span class="lit">20</span><span class="pun">];</span><span class="pln">
           </span><span class="kwd">float</span><span class="pln"> percentage</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
 
</span><span class="kwd">void</span><span class="pln"> func</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> student </span><span class="pun">*</span><span class="pln">stu1</span><span class="pun">);</span><span class="pln">
 
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln"> 
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">struct</span><span class="pln"> student stu1</span><span class="pun">;</span><span class="pln">
 
	stu1</span><span class="pun">.</span><span class="pln">id</span><span class="pun">=</span><span class="lit">21</span><span class="pun">;</span><span class="pln">
	strcpy</span><span class="pun">(</span><span class="pln">stu1</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Rambo"</span><span class="pun">);</span><span class="pln">
	stu1</span><span class="pun">.</span><span class="pln">percentage </span><span class="pun">=</span><span class="pln"> </span><span class="lit">96.5</span><span class="pun">;</span><span class="pln">
 
	func</span><span class="pun">(&amp;</span><span class="pln">stu1</span><span class="pun">);</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
</span><span class="kwd">void</span><span class="pln"> func</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> student </span><span class="pun">*</span><span class="pln">stu1</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	printf</span><span class="pun">(</span><span class="str">" Id is: %d \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">-&gt;</span><span class="pln">id</span><span class="pun">);</span><span class="pln">
	printf</span><span class="pun">(</span><span class="str">" Name is: %s \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
	printf</span><span class="pun">(</span><span class="str">" Percentage is: %f \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">-&gt;</span><span class="pln">percentage</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span>
  Id is: 21
 Name is: Rambo
 Percentage is: 96.500000
Press any key to continue . . .

No need to pass a structure – Declare structure variable as global

Structure variables also can be declared as global variables as we declare other variables in C. So, When a structure variable is declared as global, then it is visible to all the functions in a program. In this scenario, we don't need to pass the structure to any function separately.

Example Program

<span class="pln">
 </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;string.h&gt;</span><span class="pln">
 
</span><span class="kwd">struct</span><span class="pln"> student 
</span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">int</span><span class="pln"> id</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">char</span><span class="pln"> name</span><span class="pun">[</span><span class="lit">20</span><span class="pun">];</span><span class="pln">
            </span><span class="kwd">float</span><span class="pln"> percentage</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> student stu1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Global declaration of structure</span><span class="pln">
 
</span><span class="kwd">void</span><span class="pln"> structurefunction</span><span class="pun">();</span><span class="pln">
 
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln"> 
</span><span class="pun">{</span><span class="pln">
            stu1</span><span class="pun">.</span><span class="pln">id</span><span class="pun">=</span><span class="lit">21</span><span class="pun">;</span><span class="pln">
            strcpy</span><span class="pun">(</span><span class="pln">stu1</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Rambo"</span><span class="pun">);</span><span class="pln">
            stu1</span><span class="pun">.</span><span class="pln">percentage </span><span class="pun">=</span><span class="pln"> </span><span class="lit">96.5</span><span class="pun">;</span><span class="pln">
 
            structurefunction</span><span class="pun">();</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
</span><span class="kwd">void</span><span class="pln"> structurefunction</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
            printf</span><span class="pun">(</span><span class="str">" Id is: %d \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">.</span><span class="pln">id</span><span class="pun">);</span><span class="pln">
            printf</span><span class="pun">(</span><span class="str">" Name is: %s \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">.</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
            printf</span><span class="pun">(</span><span class="str">" Percentage is: %f \n"</span><span class="pun">,</span><span class="pln"> stu1</span><span class="pun">.</span><span class="pln">percentage</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span>
  Id is: 21
 Name is: Rambo
 Percentage is: 96.500000
Press any key to continue . . .

Passing Entire Structures to Functions

When a structure is used as an argument to a function, the entire structure is passed using the normal call-by-value method. Of course, this means that any changes made to the contents of the parameter inside the function do not affect the structure passed as the argument.

When using a structure as a parameter, remember that the type of the argument must match the type of the parameter. For example, in the following program both the argument record1 and the parameter parameter are declared as the same type of structure.

Example Program

<span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">/* Define a structure type. */</span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> struct_type </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">char</span><span class="pln"> ch</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="pun">;</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> f1</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> struct_type record1</span><span class="pun">);</span><span class="pln">


</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">struct</span><span class="pln"> struct_type record1</span><span class="pun">;</span><span class="pln">
	record1</span><span class="pun">.</span><span class="pln">a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1070</span><span class="pun">;</span><span class="pln">
	
	f1</span><span class="pun">(</span><span class="pln">record1</span><span class="pun">);</span><span class="pln">
	
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> f1</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> struct_type parameter</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	printf</span><span class="pun">(</span><span class="str">"%d \n"</span><span class="pun">,</span><span class="pln"> parameter</span><span class="pun">.</span><span class="pln">a</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span>
10
Press any key to continue . . .

As this program illustrates, if you will be declaring parameters that are structures, you must make the declaration of the structure type global so that all parts of your program can use it. For example, had struct_type been declared inside main( ), it would not have been visible to f1( ).


No Questions Data Available.
No Program Data.

Stay Ahead of the Curve! Check out these trending topics and sharpen your skills.