Write a c program to print Hello world without using any
semicolon.
Explanation:
Solution: 1
void main(){
if(printf("Hello
world")){
}
}
Solution: 2
void main(){
while(!printf("Hello
world")){
}
}
Solution: 3
void main(){
switch(printf("Hello
world")){
}
}
Swap two variables without using third variable.
Explanation:
#include<stdio.h>
int main(){
int a=5,b=10;
//process one
a=b+a;
b=a-b;
a=a-b;
printf("a= %d b= %d",a,b);
//process two
a=5;
b=10;
a=a+b-(b=a);
printf("\na= %d b= %d",a,b);
//process three
a=5;
b=10;
a=a^b;
b=a^b;
a=b^a;
printf("\na= %d b= %d",a,b);
//process four
a=5;
b=10;
a=b-~a-1;
b=a+~b+1;
a=a+~b+1;
printf("\na= %d b= %d",a,b);
//process five
a=5,
b=10;
a=b+a,b=a-b,a=a-b;
printf("\na= %d b= %d",a,b);
return 0;
}
What is dangling pointer in c?
Explanation:
Dangling pointer:
If any pointer is pointing the
memory address of any variable but after some variable has deleted from that
memory location while pointer is still pointing such memory location.
Such pointer is known as dangling pointer and this problem is known as dangling
pointer problem.
Initially:
Later:
For example:
What will be output of following c program?
#include<stdio.h>
int *call();
int main(){
int *ptr;
ptr=call();
fflush(stdin);
printf("%d",*ptr);
return 0;
}
int * call(){
int x=25;
++x;
return &x;
}
Output: Garbage value
Note: In some compiler you may get warning message returning
address of local variable or temporary
Explanation: variable x is local variable. Its scope and
lifetime is within the function call hence after returning address of x
variable x became dead and pointer is still pointing ptr is still pointing to
that location.
Solution of this problem:
Make the variable x is as static variable. In other
word we can say a pointer whose pointing object has been deleted is called
dangling pointer.
#include<stdio.h>
int *call();
int main(){
int *ptr;
ptr=call();
fflush(stdin);
printf("%d",*ptr);
return 0;
}
int * call(){
static int x=25;
++x;
return &x;
}
Output: 26
What is
wild pointer in c?
Explanation:
A pointer in c which has not been
initialized is known as wild pointer.
Example:
What will be output of following c
program?
int main(){
int *ptr;
printf("%u\n",ptr);
printf("%d",*ptr);
return 0;
}
Output: Any
address
Garbage value
Here ptr is wild pointer because it
has not been initialized. There is
difference between the NULL pointer and wild pointer. Null pointer points the
base address of segment while wild
pointer doesn’t point any specific memory location.
What are merits and demerits of array in c?
Explanation:
Merits:
(a) We can easily
access each element of array.
(b) Not necessity to
declare too many variables.
(c) Array elements are
stored in continuous memory location.
Demerit:
(a) Wastage of memory
space. We cannot change size of array at the run time.
(b) It can store only similar
type of data.
Do you know memory representation of int a = 7 ?
Explanation:
Memory representation of:
signed int
a=7; (In Turbo c compiler)
signed short int a=7 (Both turbo c
and Linux gcc compiler)
Binary equivalent of data 7 in 16
bit: 00000000 00000111
Data bit: 0000000
00000111 (Take first 15 bit form right side)
Sign bit: 0 (Take leftmost one
bit)
First eight bit of
data bit from right side i.e. 00000111 will store in the leftmost byte from
right to left side and rest seven bit of data bit i.e. 0000000 will store in
rightmost byte from right to left side as shown in the following
figure:
What is
and why array in c?.
Explanation:
An array is derived
data type in c programming language which can store similar type of data in continuous
memory location. Data may be primitive type (int, char, float, double…),
address of union, structure, pointer, function or another array.
Example of array
declaration:
int arr[5];
char arr[5];
float arr[5];
long double arr[5];
char *
arr[5];
int (arr[])();
double **
arr[5];
Array is useful when:
(a) We have to store
large number of data of similar type. If we have large number of similar kind
of variable then it is very difficult to remember name of all variables and
write the program. For example:
//PROCESS ONE
int main(){
int ax=1;
int b=2;
int cg=5;
int dff=7;
int am=8;
int raja=0;
int rani=11;
int xxx=5;
int yyy=90;
int p;
int q;
int r;
int avg;
avg=(ax+b+cg+dff+am+raja+rani+xxx+yyy+p+q+r)/12;
printf("%d",avg);
return 0;
}
If we will use array
then above program can be written as:
//PROCESS TWO
int main(){
int arr[]={1,2,5,7,8,0,11,5,50};
int i,avg;
for(int i=0;i<12;i++){
avg=avg+arr[i];
}
printf("%d",avg/12);
return 0;
}
Question: Write a C
program to find out average of 200 integer number using process one and two.
(b) We want to store
large number of data in continuous memory location. Array always stores data in
continuous memory location.
What will be output
when you will execute the following program?
int main(){
int arr[]={0,10,20,30,40};
char *ptr=arr;
arr=arr+2;
printf("%d",*arr);
return 0;
}
Advantage of using
array:
1. An array provides singe
name .So it easy to remember the name of all element of an array.
2. Array name gives
base address of an array .So with the help increment operator we can visit one
by one all the element of an array.
3. Array has many
application data structure.
Array of pointers in
c:
Array whose content is
address of another variable is known as array pointers. For example:
int main(){
float a=0.0f,b=1.0f,c=2.0f;
float *
arr[]={&a,&b,&c};
b=a+c;
printf("%f",arr[1]);
return 0;
}
Why we
use do-while loop in c? Also tell any properties which you know?
Explanation:
It is also called as
post tested loop. It is used when it is necessary to execute the loop at least
one time. Syntax:
do {
Loop body
} while (Expression);
Example:
int main(){
int num,i=0;
do{
printf("To enter press 1\n");
printf("To exit press 2");
scanf("%d",&num);
++i;
switch(num){
case 1:printf("You
are welcome\n");break;
default : exit(0);
}
}
while(i<=10);
return 0;
}
Output: 3 3 4 4
If there is only one
statement in the loop body then braces is optional. For example:
(a)
int main(){
double i=5.5678;
do
printf("hi");
while(!i);
return 0;
}
Output: 3 3 4 4
(b)
int main(){
double i=5.63333;
do
printf("hi");
while(!i);
return 0;
}
Output: hi
(c)
int main(){
int x=25,y=1;
do
if(x>5)
printf(" ONE");
else if(x>10)
printf(" TWO");
else if(x==25)
printf(" THREE");
else
printf(" FOUR");
while(y--);
return 0;
}
Output: ONE ONE
What is the meaning of prototype of a function?
Explanation:
Prototype of a function
Declaration of function is known as
prototype of a function. Prototype of a function means
(1) What is return type of
function?
(2) What parameters are we
passing?
(3) For example prototype of
printf function is:
int printf(const char *, …);
I.e. its return type is int data
type, its first parameter constant character pointer and second parameter is
ellipsis i.e. variable number of arguments.
Write a c program to modify the constant variable in c?
Explanation:
You can modify
constant variable with the help of pointers. For example:
#include<stdio.h>
int main(){
int i=10;
int *ptr=&i;
*ptr=(int *)20;
printf("%d",i);
return 0;
}
Output: 20
What is NULL pointer?
Explanation:
Literal meaning of
NULL pointer is a pointer which is pointing to nothing. NULL pointer points the
base address of segment.
Examples of NULL pointer:
1. int *ptr=(char *)0;
2. float *ptr=(float *)0;
3. char *ptr=(char *)0;
4. double *ptr=(double *)0;
5. char *ptr=’\0’;
6. int *ptr=NULL;
What is meaning of NULL?
Answer:
NULL is macro constant
which has been defined in the heard file stdio.h, alloc.h, mem.h, stddef.h and
stdlib.h as
#define NULL 0
Examples:
(1)What will be output of following
c program?
#include "stdio.h"
int main(){
if(!NULL)
printf("I know preprocessor");
else
printf("I don't know preprocessor");
}
Output: I know preprocessor
Explanation:
!NULL = !0 = 1
In if condition any non zero number
mean true.
(2)What will be output of following
c program?
#include "stdio.h"
int main(){
int i;
static int count;
for(i=NULL;i<=5;){
count++;
i+=2;
}
printf("%d",count);
}
Output: 3
(3)What will be output of following
c program?
#include "stdio.h"
int main(){
#ifndef NULL
#define NULL
5
#endif
printf("%d",NULL+sizeof(NULL));
}
Output: 2
Explanation:
NULL + sizeof(NULL)
=0 + sizeoof(0)
=0+2 //size of int data type is
two byte.
We cannot copy anything in the NULL
pointer.
Example:
(4)What will be output of following
c program?
#include "string.h"
int main(){
char *str=NULL;
strcpy(str,"c-pointer.blogspot.com");
printf("%s",str);
return 0;
}
Output: (null)
What is difference between pass by value and pass by reference?
Explanation:
In c we can pass the
parameters in a function in two different ways.
(a)Pass by value:
In this approach we pass copy of actual variables in function as a parameter.
Hence any modification on parameters inside the function will not reflect in
the actual variable. For example:
#include<stdio.h>
int main(){
int a=5,b=10;
swap(a,b);
printf("%d %d",a,b);
return 0;
}
void swap(int a,int b){
int temp;
temp =a;
a=b;
b=temp;
}
Output:
5 10
(b)Pass by
reference: In this approach we pass memory address actual variables in
function as a parameter. Hence any modification on parameters inside the
function will reflect in the actual variable. For example:
#incude<stdio.h>
int main(){
int a=5,b=10;
swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
void swap(int *a,int *b){
int *temp;
*temp =*a;
*a=*b;
*b=*temp;
}
Output: 10 5
What is size of void pointer?
Explanation:
Size of any type of
pointer in c is independent of data type which is pointer is pointing i.e. size
of all type of pointer (near) in c is two byte either it is char pointer,
double pointer, function pointer or null pointer. Void pointer is
not exception of this rule and size of void pointer is also two byte.
What
is difference between uninitialized pointer and null
pointer?
Explanation:
An uninitialized
pointer is a pointer which points unknown memory location while null pointer is
pointer which points a null value or base address of segment. For
example:
int *p; //Uninitialized pointer
int *q=
(int *)0; //Null pointer
#include<stdio.h>
int *r=NULL; //Null pointer
What will be output of following c
program?
#include<string.h>
#include<stdio.h>
int main(){
char *p; //Uninitialized
pointer
char *q=NULL; //Null pointer;
strcpy(p,"cquestionbank");
strcpy(q,"cquestionbank");
printf("%s %s",p,q);
return 0;
}
Output: cquestionbank (null)
Can you read complex pointer declaration?
Explanation:
Rule 1. Assign the priority to
the pointer declaration considering precedence and associative according to
following table.
(): This operator behaves as
bracket operator or function operator.
[]: This operator behaves as
array subscription operator.
*: This operator behaves as pointer
operator not as multiplication operator.
Identifier: It is not an operator
but it is name of pointer variable. You will always find the first priority
will be assigned to the name of pointer.
Data type: It is also not an
operator. Data types also includes modifier (like signed int, long double etc.)
You will understand it better by
examples:
(1) How to read following pointer?
char (* ptr)[3]
Answer:
Step 1: () and [] enjoys equal
precedence. So rule of associative will decide the priority. Its associative is
left to right so first priority goes to ().
Step 2: Inside the bracket *
and ptr enjoy equal precedence. From rule of associative (right to left) first
priority goes to ptr and second priority goes to *.
Step3: Assign third priority to
[].
Step4: Since data type enjoys
least priority so assign fourth priority to char.
Now read it following manner:
ptr is pointer to such one dimensional array of size three which content char type data.
(2) How to read following pointer?
float (* ptr)(int)
Answer:
Assign the priority considering
precedence and associative.
Now read it following manner:
ptr is pointer to such function whose
parameter is int type data and return type is float type
data.
Rule 2: Assign the priority of
each function parameter separately and read it also separately. Understand it
through following example.
(3) How to read following pointer?
void (*ptr)(int (*)[2],int (*)
void))
Answer:
Assign the priority considering rule
of precedence and associative.
Now read it following manner:
ptr is pointer to such function which
first parameter is pointer to one dimensional array of size two which contentint type data and second parameter is pointer to such function which
parameter is void and return type is int data
type and return type is void.
(4) How to read following pointer?
int ( * ( * ptr ) [ 5 ] ) ( )
Answer:
Assign the priority considering rule
of precedence and associative.
Now read it following manner:
ptr is pointer to such array of
size five which content are pointer to
such function which parameter is void
and return type is int type data.
(5) How to read following pointer?
double*(*(*ptr)(int))(double **,char
c)
Answer:
Assign the priority considering rule
of precedence and associative.
Now read it following manner:
ptr is pointer to function which
parameter is int type data and return type is pointer to function which first parameter is pointer to
pointer of double data type and second parameter is char type data type and
return type ispointer to double data type.
(6) How to read following pointer?
unsigned **(*(*ptr)[8](char const *,
...)
Answer:
Assign the priority considering rule
of precedence and associative.
Now read it following manner:
ptr is pointer to array of
size eight and content of array is pointer to function which first parameter is pointer to
character constant and second parameter is variable number of arguments and
return type is pointer to pointer of unsigned int
data type.
What are the parameter passing conventions in c?
Explanation:
1. pascal: In this style
function name should (not necessary ) in the uppercase .First parameter of
function call is passed to the first parameter of function definition and so
on.
2. cdecl: In this style
function name can be both in the upper case or lower case. First parameter of
function call is passed to the last parameter of function definition. It is
default parameter passing convention.
Examples:
1. What will be output of following
program?
int main(){
static int a=25;
void cdecl
conv1() ;
void pascal
conv2();
conv1(a);
conv2(a);
return 0;;
}
void cdecl
conv1(int a,int b)
{
printf("%d
%d",a,b);
}
void pascal
conv2(int a,int b)
{
printf("\n%d
%d",a,b);
}
Output: 25 0
0 25
(2) What will be output of following program?
void cdecl
fun1(int,int);
void pascal
fun2(int,int);
int main(){
int a=5,b=5;
fun1(a,++a);
fun2(b,++b);
return 0;
}
void cdecl
fun1(int p,int q){
printf("cdecl: %d %d \n",p,q);
}
void pascal
fun2(int p,int q){
printf("pascal: %d %d",p,q);
}
Output:
cdecl: 6 6
pascal: 5 6
(3) What will be output of following
program?
void cdecl
fun1(int,int);
void pascal
fun2(int,int);
int main(){
int a=5,b=5;
fun1(a,++a);
fun2(b,++b);
return 0;
}
void cdecl
fun1(int p,int q){
printf("cdecl: %d %d \n",p,q);
}
void pascal
fun2(int p,int q){
printf("pascal: %d %d",p,q);
}
Output:
cdecl: 6 6
pascal: 5 6
(4) What will be output of following
program?
void convention(int,int,int);
int main(){
int a=5;
convention(a,++a,a++);
return 0;
}
void convention(int p,int q,int r){
printf("%d %d %d",p,q,r);
}
Output: 7 7 5
(5) What will be output of following
program?
void pascal
convention(int,int,int);
int main(){
int a=5;
convention(a,++a,a++);
return 0;}
void pascal
convention(int p,int q,int r){
printf("%d %d %d",p,q,r);
}
Output: 5 6 6
(6) What will be output of following
program?
void pascal
convention(int,int);
int main(){
int a=1;
convention(a,++a);
return 0;
}
void pascal
convention(int a,int b){
printf("%d %d",a,b);
}
Output: 1 2
(7) What will be output of following
program?
void convention(int,int);
int main(){
int a=1;
convention(a,++a);
return 0;}
void convention(int a,int b){
printf("%d %d",a,b);
}
Output: 2 2
What is the far pointer in c?
Explanation:
The pointer which can point or
access whole the residence memory of RAM i.e. which can access all 16 segments
is known as far pointer.
Size of far pointer is 4 byte or 32
bit. Examples:
(1) What will be output of following
c program?
int main(){
int x=10;
int far
*ptr;
ptr=&x;
printf("%d",sizeof ptr);
return 0;
}
Output: 4
(2)What will be output of following
c program?
int main(){
int far
*near*ptr;
printf("%d
%d",sizeof(ptr) ,sizeof(*ptr));
return 0;
}
Output: 4 2
Explanation: ptr is far pointer
while *ptr is near pointer.
(3)What will be output of following
c program?
int main(){
int far
*p,far *q;
printf("%d
%d",sizeof(p) ,sizeof(q));
}
Output: 4 4
First 16 bit stores: Segment
number
Next 16 bit stores: Offset
address
Example:
int main(){
int x=100;
int far
*ptr;
ptr=&x;
printf("%Fp",ptr);
return 0;
}
Output: 8FD8:FFF4
Here 8FD8 is segment address and
FFF4 is offset address in hexadecimal number format.
Note: %Fp is used for print
offset and segment address of pointer in printf function in hexadecimal number
format.
In the header file
dos.h there are three macro functions to get the offset address and segment
address from far pointer and vice versa.
1. FP_OFF(): To get offset
address from far address.
2. FP_SEG(): To get segment
address from far address.
3. MK_FP(): To make far
address from segment and offset address.
Examples:
(1)What will be output of following
c program?
#include "dos.h"
int main(){
int i=25;
int far*ptr=&i;
printf("%X %X",FP_SEG(ptr),FP_OFF(ptr));
}
Output: Any segment and offset
address in hexadecimal number format respectively.
(2)What will be output of following
c program?
#include "dos.h"
int main(){
int i=25;
int far*ptr=&i;
unsigned int s,o;
s=FP_SEG(ptr);
o=FP_OFF(ptr);
printf("%Fp",MK_FP(s,o));
return 0;
}
Output: 8FD9:FFF4 (Assume)
Note: We cannot guess what will be offset address; segment address and far
address of any far pointer .These address are decided by operating system.
Limitation of far pointer:
We cannot change or
modify the segment address of given far address by applying any arithmetic
operation on it. That is by using arithmetic operator we cannot jump from one
segment to other segment. If you will increment the far address beyond the
maximum value of its offset address instead of incrementing segment address it
will repeat its offset address in cyclic order.
Example:
(q)What will be output of following
c program?
int main(){
int i;
char far
*ptr=(char *)0xB800FFFA;
for(i=0;i<=10;i++){
printf("%Fp
\n",ptr);
ptr++;
}
return 0;
}
Output:
B800:FFFA
B800:FFFB
B800:FFFC
B800:FFFD
B800:FFFE
B800:FFFF
B800:0000
B800:0001
B800:0002
B800:0003
B800:0004
This property of far
pointer is called cyclic nature of far pointer within same segment.
Important points about far pointer:
1. Far pointer
compares both offset address and segment address with relational operators.
Examples:
(1)What will be output of following
c program?
int main(){
int far
*p=(int *)0X70230000;
int far
*q=(int *)0XB0210000;
if(p==q)
printf("Both
pointers are equal");
else
printf("Both
pointers are not equal");
return 0;
}
Output: Both pointers are not
equal
(2)What will be output of following
c program?
int main(){
int far
*p=(int *)0X70230000;
int far
*q=(int *)0XB0210000;
int near
*x,near*y;
x=(int near
*)p;
y=(int near
*)q;
if(x==y)
printf("Both
pointer are equal");
else
printf("Both
pointer are not equal");
return 0;
}
Output: Both pointers are equal
2. Far pointer doesn’t normalize.
What is a cyclic property of data type in c? Explain with any
example.
Explanation:
#include<stdio.h>
int main(){
signed char c1=130;
signed char c2=-130;
printf("%d %d",c1,c2);
return 0;
}
Output:
-126 126 (why?)
This situation is
known as overflow of signed char.
Range of unsigned char
is -128 to 127. If we will assign a value greater than 127 then value of
variable will be changed to a value if we will move clockwise direction as
shown in the figure according to number. If we will assign a number which is
less than -128 then we have to move in anti-clockwise direction.














No comments:
Post a Comment