The basic purpose of developing a C programming tutorial for this website – CircuitsToday – is to make it useful for people who wish to work with embedded systems. Really good C programming skill is an essential to work with embedded systems and “Pointers” is the most important concept in C that should be mastered by an embedded systems programmer. “Pointers” are so important because it enables a programmer to work directly with memory of the system. Memory of a system is organized as a sequence of byte sized locations (1 byte = 8 bits). If the total memory of the system is 128 bytes then there will be 128 accessible locations of 1 byte each. Each of these 128 locations are numbered from 0 to 127 in a special manner like 0000, 0001, 0002 …etc. The number associated with a byte is known as the address of the memory location.

You may refer the figure below to get an idea – how memory is organized with in 8051

A pointer is an entity which holds the address of a memory location. So if the address of a location is 2050H, pointer is used to hold this particular address.

Note:- Address of a memory location is always a positive integer. The range of address is from zero to a positive integer constant (which is the address of the last memory location ).

Pointer variables

We can use variables to hold address of a memory location and such variables are known as pointer variables. We have seen before that normal variables are used to store data items of a particular data type (char, int, float etc). Before using a variable in a program, we declare it at the beginning. Similarly we need to declare a pointer variable too in a special way – to let the compiler know we have declared a variable as a pointer (not as a normal variable). To do this we have the *operator – known as indirection operator in C.

Pointer variable declaration

The syntax to declare a pointer variable is

(data type)   *(variable name);

Ex:-  int  *ptr ;

Here we have declared a pointer variable of name ‘ptr’ and it is of type integer (int).

Why we need data types in pointers ?

The first doubt that may come to many is, why we need data types to declare a pointer variable. Well, here is the explanation. The address of a memory location will contain a data – rite? And it can be of type char, int, float etc. The difference between all these data types is in the size allocated to each data type. Char – is 1 byte where as int – is 2 byte and float is 4 bytes. Memory is allocated to all these data types as sequential blocks.

Just consider a scenario like this:-

char a ;

int b;

float c; 

Lets start memory allocation from 2000H.

Now the character variable ‘a‘ will be allocated 2000H (1 byte), where as integer variable ‘b’ will be allocated 2 bytes using 2001H and 2002H. Finally the float variable ‘c’ will be allocated 4 bytes using 4 consecutive locations – 2003H, 2004H, 2005H, 2006H. Now you might get an idea of why we need data types to declare pointer variables. It is because memories are allocated in sequential blocks according to the type of data holded in those locations.

So when we declare a pointer variable as float *ptr and then assign address of the normal float variable c to ptr – what really happens is – ptr is assigned the sequential block from 2003H to 2006H as a whole. But the variable ptr will hold only the starting address of the sequential block i.e 2003H

So a pointer variable must be declared with a data type. And this data type should be the same data type as of the contents inside the memory location address – which is assigned to the pointer variable. Ex:- If 2000H is assigned to a pointer variable ptr and the contents inside 2000H is a character. In this case the pointer variable ptr should be declared as a character pointer as shown below:-

char  *ptr; 

Note:- In fact we can actually declare a pointer variable without any data type using the keyword void. It is known as a void pointer. The topic of void pointer has to be explained separately – so I will explain it in my next post.

Assigning address to a pointer variable

To make use of a pointer and it’s capabilities – the address of a particular memory location must be assigned to the pointer. It is possible to assign address of single variable or that of an array or the address of a structure etc to a pointer variable. This capability makes pointers the most powerful tool in C programming. We can literally play with the memory of a system using pointers.

To assign address of an entity to a pointer variable – we use the & operator (address of operator). The operator & fetches the memory location of a variable.

So taking our earlier case as example:-

#include

void main()

{

int *ptr; // Declaring the pointer variable 'ptr' of data type int

int a; // Declaring a normal variable 'a'

ptr=&a; // Assigning address of variable 'a' to pointer variable 'ptr'

}

Dereferencing a pointer (getting the real content from a memory location)

We have seen upto assigning an address to a pointer variable. Now how to get the content inside the memory location using the same pointer variable? For that we use the same indirection operator * used to declare a pointer variable.

Consider the scenario:-

#include

void main()

{

int *ptr; // Declaring the pointer variable 'ptr' of data type int

int a=; // Declaring a normal variable 'a' and assigning value 10 to it.

ptr=&a; // Assigning address of variable 'a' to pointer variable 'ptr'

printf("The value inside pointer is= %d",*ptr); // See the value is printed using *ptr;

}

Introduction to pointers in C的更多相关文章

  1. Void pointers in C

    In this article we are learning about “void pointers” in C language. Before going further it will be ...

  2. <转>年终盘点!2017年超有价值的Golang文章

    马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍. 文章排名不分先后, 文章也不一定完全按照日期来排列.我按照文章的大致内容分了类,便于查找 ...

  3. Introduction of OpenCascade Foundation Classes

    Introduction of OpenCascade Foundation Classes Open CASCADE基础类简介 eryar@163.com 一.简介 1. 基础类概述 Foundat ...

  4. Introduction of Open CASCADE Foundation Classes

    Open CASCADE Foundation Classes Open CASCADE基础类 eryar@163.com 一.简介 1. 基础类概述 Foundation Classes Overv ...

  5. Brief introduction to Scala and Breeze for statistical computing

    Brief introduction to Scala and Breeze for statistical computing 时间 2013-12-31 03:17:19  Darren Wilk ...

  6. Introduction the naive“scull” 《linux设备驱动》 学习笔记

    Introduction the naive "scull" 首先.什么是scull? scull (Simple Character Utility for Loading Lo ...

  7. Reading task(Introduction to Algorithms. 2nd)

    Introduction to Algorithms 2nd ed. Cambridge, MA: MIT Press, 2001. ISBN: 9780262032933. Introduction ...

  8. Introduction to Parallel Computing

    Copied From:https://computing.llnl.gov/tutorials/parallel_comp/ Author: Blaise Barney, Lawrence Live ...

  9. [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理

    [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理   Introduction to DPDK: ...

随机推荐

  1. [AWS - EC2]如何使用 PuTTY 连接到 Amazon Linux 2 实例。How to Connect Amazon Linux 2 Instance from Windows Using PuTTY

    1. 下载 PuTTY 2. 安装到任意目录 3. 打开 PuTTYgen (注意不是 PuTTY), 如图: 选择 RSA , 点击 Load. 找到从 AWS 创建实例的时候生成的 key,要选择 ...

  2. Django学习系列19:完成最简单可用的网站——确保功能之间相互隔离

    前面遗留的问题,首先时功能测试运行结束后的清理:其次是目前我们的待办清单只允许创建一个大家公用的清单. 如何隔离测试,运行功能测试后待办事项一直存在于数据库中,这会影响下一次测试. 运行单元测试时,D ...

  3. Junit(手动/自动)加载

    ssm中测试service层数据 Junit手动加载配置文件 package com.oukele.bookshop_ssm.service; import org.junit.After; impo ...

  4. spark 三种数据集的关系(二)

    一个Dataset是一个分布式的数据集,而且它是一个新的接口,这个新的接口是在Spark1.6版本里面才被添加进来的,所以要注意DataFrame是先出来的,然后在1.6版本才出现的Dataset,提 ...

  5. Chrome安卓H5调试,连接手机检测不到页面

    Chrome安卓H5调试,连接手机检测不到页面,重启什么的都不行,未找到设备,或者offline,怎么办? 首先手机开启调试模式是必须的 然后用adb工具箱,cmd进来 运行命令 adb kill-s ...

  6. 34.第一次只出现一次的字符(python)

    题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).   两次遍历,第一次存放字 ...

  7. jquery file选择器 语法

    jquery file选择器 语法 作用::image 选择器选取类型为 file 的 <input> 元素.大理石平台检定规程 语法:$(":file") jquer ...

  8. SDOI2015 寻宝游戏 | noi.ac#460 tree

    题目链接:戳我 可以知道,我们相当于是把有宝藏在的地方围了一个圈,求这个圈最小是多大. 显然按照dfs序来遍历是最小的. 那么我们就先来一遍dfs序列,并且预处理出来每个点到根的距离(这样我们就可用\ ...

  9. 快速乘(O(1))

    inline long long multi(long long x,long long y,long long mod) { long long tmp=(x*y-(long long)((long ...

  10. [笔记]动态规划(dynamic programming)

    动态规划与分治方法都是通过组合子问题的解来求解原问题,区别在于:分治方法将问题划分为互不相交的子问题,递归求解子问题,再将它们的解组合起来,求出原问题的解.分治算法可能反复的求解某些公共子问题,从而使 ...