C Language Study - 指针的形式 & 下标的形式

指针形式和下标形式

A> char *p = "abcdef";//定义一个字符串,用一个指针指向这个字符串

B>char a[] = "123456";//定义一个字符数组 a 是数组首元素的首地址,而不是数组的首地址

在上面的A>定义中,假如我们要取出c这个字符,那么有以下两种方法:

<1> 指针的形式:*(p+3)

<2>下标的形式:p[3]

两种方式,我们都可以这个进行理解:

编译器首先计算出p的值,也就是p所储存的地址值,然后加上偏移量3,得到一个新的地址,

然后再取出这个新地址里面所存储的数据,也就是字符c

例如,可以写出以下程序输出A>中定义的字符串。

#include <stdio.h>

int main(void)
{
    char *p="abcdef";//A>
    int iOffset = 0;
    for(iOffset=0;iOffset<strlen(p);iOffset++)
        printf("%c",*(p+iOffset));
    return 0;
}

同理,在B>的定义下,假若我们要取出5这个数据,也有两种方法:

<1>指针的形式:*(a+4) ;此时,a代表的是数组首元素的首地址,然后用这个地址加上偏移量,

得到一个新的地址,再从这个地址取出数据

<2>下标的形式:a[4];一样。

值得注意的是,不知道你发现没有,上面所说的偏移量,有一个问题,在取出基地址(A>中的p值,B>中的a地址)后,

所加的偏移量应该是偏移数X每个元素的大小。上例中因为字符类型的内存大小刚好为1,所以很容易产生误导。特别注意!

时间: 2024-08-06 20:05:57

C Language Study - 指针的形式 & 下标的形式的相关文章

C Language Study - the use of symbol &#39;##&#39;

## #include <stdio.h> #define INTVARIABLE(n) i##n int main(void) { int INTVARIABLE(2) = 3; printf("i2=%d\n",i2);//output i2=3 i2 = 5; printf("i2=%d\n",i2);//output i2=5 return 0; } C Language Study - the use of symbol '##'

C Language Study - how to use &#39;#&#39;

宏中的#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号. 如定义好#define STRING(x) #x之后,下面二条语句就等价. char *pChar = "hello"; char *pChar = STRING(hello); 还有一个#@是加单引号(Charizing Operator) #define makechar(x)  #@x char ch = makechar(b);与ch

C Language Study - 0 &amp; &#39;0&#39; &amp; &#39;\0&#39;

The difference of 0 & '0' & '\0' ------------------------------------------------------------ 0 is a number(decimal). ------------------------------------------------------------ '0' is a char. It's ASCII equal  48(decimal). ----------------------

RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用

RDIFramework.NET框架SOA解决方案(集Windows服务.WinForm形式与IIS形式发布)-分布式应用 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为指导思想,作为异质系统整合与互操作性.分布式应用提供了可行的解决方案. 1.SOA平台简介 1.1.概述 SOA(service-oriented architecture,也叫面向服务的体系结构或面向服务架构)是指为了解决在Inte

原始(prototype)模型模式之简单形式与登记形式

原始模型模式有两种表现形式:第一种是简单形式,第二种是登记形式,下面将分别讲解两种原型模型模式的不同实现. 简单形式的原始模型模式 uml类图为: 这种形式涉及到三种角色: *客户(Client)角色:客户类提出创建对象的请求. *抽象原型(Prototype)角色:这是一个抽象角色,通常由一个Java接口或者java抽象类实现. *具体原型(Concrete Prototype)角色:被复制的对象. 以下是一个简单的原型模型的实现. Client: package prototype.prot

C Language Study - 函数指针的使用

函数指针的使用 1.函数指针定义 第一次使用函数指针,我是这样声明的,typedef void ( *pSimulatepks )( uint8 *prxBuf, uint8 *prxBufLen ): 第一个括号(),将pSimulatepks包成一个指针,第二个括号(),意思就是一个函数的参数列表,所以pSimulatepks是一个函数指针,指向这样一类函数的指针. 上面声明了一个函数指针,就可以这样定义一个函数指针,pSimulatepks pfun; 2.函数指针调用函数 例如,有一个函

C Language Study - 错误的指针初始化方式

本文测试指针初始化的方式: 错误初始化方式一: int* p = NULL;//此句等于p = NULL;将指针指向了NULL这个地址,(NULL=0x0) *p = 0x10;//试图访问0x0内存,被拒绝 错误初始化方式二: int* p;//定义的时候未进行初始化,此时指针指向一块未知的内存 *p = 0x10;//试图访问未知内存,被拒绝 那么指针到底如何初始化? 初始化方式参考一: 首先定义一个相应类型的变量,我们称之为指针初始化变量,它的作用 就是用来进行指针初始化的,或者程序中可以

C Language Study - 结构体成员指针初始化

结构体成员指针初始化 不可以正确运行的初始化方式(1): #include <stdio.h> #include <string.h> #include <malloc.h> //#include "a.h" //char a[100]; struct stu { char* name; int num; }*pst,st; void init_pst() { pst = (struct stu *)malloc(sizeof(struct stu)

C++Study 指针详解

C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明. 先声明几个指针放着做例子: 例一: int *ptr; char *ptr; int **ptr; int (*ptr)[3]; int *(*ptr)[4]; 指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类