`
473687880
  • 浏览: 535536 次
文章分类
社区版块
存档分类
最新评论

C语言指针类型、指针大小、指针所指元素大小、指针加减运算

 
阅读更多

摘要:在C语言编程的过程中,我们经常用到多维数组,指针的加减运算等等。如果我们想把一个二维数组传递给一个函数,为什么不能用“a[][]”这样的形参模式?而把一维数组传递给函数可以用int a[]这样的形式?内核代码中,我们常常能看到,有两个page类型的结果体指针pagea和pageb,那么pageb-pagea数值上等于多少?是地址差还是index的差值?本文主要为你解答这些问题。


本文来源:C语言指针类型、指针大小、指针所指元素大小、指针加减运算

http://blog.csdn.net/trochiluses/article/details/13288651


1.指针类型


在编程中,我们经常使用这样的定义:

int *a;
double *dh;
struct student * mystudent;

当提到a、dh、mystudent的时候,我们常说他们是一个指针,潜意识里并没有区分指针类型其实并不是一个类型而是一系列类型的统称。为什么指针类型至关重要呢?因为这涉及到指针所指变量的大小和指针的加减运算。

如果指针a是指向int类型,那么对a进行地址解析的时候,会根据a的类型决定地址解析会解析对应地址内容往后的多少字节。


2.指针大小


所有指针的大小在32位机器上都是4个字节。


3.指针所指元素的大小


有一道经典的体系结构相关的C语言试题:如何判断机器的大小端?

我们都知道,假如有一个int数据a,数值是0x12345678,需要存储到地址100外后的4个字节中,那么从低位到高位,大小端的存储方法如下:

78563412(小端),12345678(大段)。我们是不是可以用char *chp=(char *)&a,然后对chp进行地址解析,(*chp)=?是否能判断机器的大小端呢?


分析:对a取得地址,得到低位地址,然后把这个地址赋值给char *p,对p进行地址解析就能得到地位地址存储的数值,从而判断机器是大还是小端。


4.指针运算


先来看看下面这个程序:

  6   int a[3][3]={
  7     [0]={1,2,3 },
  8     [1]={4,5,6 },
  9     [2]={7,8,9 },
 10   };
 11   int b[3][3]={
 12     [0]={1,2,3 },
 13     [1]={4,5,6 },
 14     [2]={7,8,9 },
 15   };
 16   printf("b-a=%d\n",b-a );
 17   printf("%p\n",a[2]);
 18   int (*p)[3]=a+1;
 19 
 20   printf("the address of a is :%p\n",a);
 21   printf("the address of p  is :%p\n",p);
 22   printf("the address of a[0]+1  is :%p\n",a[0]+1);
 23 
 24   int mnt=p-a;
 25   printf("mnt=%d",mnt);
 26   return 0;

分析这个程序的输出:

首先,a是一个3*3的int数组,那么a是一个指针,指向数组(数组由3个int而不是3*3个int)的指针,很明显b和a的地址相差3*3*4个字节,那么b-a是多少呢?36,9,3,还是1?

分析清楚了这个结果,基本上就明白了指针所指元素大小的意义。让我们来看结果:

总结:b-a的数值,并不等于b,a对应地址算术相减的结果,而是这个结果除以他们对应指针所指元素大小。



分享到:
评论

相关推荐

    C语言指针练习填空和阅读程序题

    本资源主要涵盖了C语言指针的相关知识点,包括指针的基本概念、指针运算、指针与数组的关系、指针与字符串的关系等。通过本资源的学习,可以帮助读者更好地理解和掌握C语言指针的知识。 一、指针的基本概念 指针是...

    c语言指针学习笔记

    指针变量必须与其所指向的变量的数据类型一致,这是因为不同类型的数据占用的内存大小可能不同。在定义指针变量时,应先声明数据类型和变量名,例如int *p;声明了一个指向整型数据的指针变量p。指针变量初始化时,...

    C语言指针注意事项

    不同类型的指针在进行加减运算时,其步长取决于指针所指向的类型大小。例如,`int *ptr`和`char *ptr`在进行`+1`操作时,`int *ptr`会移动`sizeof(int)`个字节,而`char *ptr`只移动`sizeof(char)`个字节,因为`int`...

    C语言指针总结

    指针的加减运算基于指针所指向类型的大小进行,而指针之间的减法运算则可以得到两个指针之间的元素个数。 在使用指针时,还需要注意指针的安全性问题。未初始化的指针、空悬指针、越界指针都是常见的安全隐患。因此...

    C语言指针的运用

    `:这是一个指向含有3个整型元素的数组的指针,指针类型为`int (*)[3]`,指向的类型为`int [3]`。 5. `int *(*ptr)[4];`:这是一个指向含有4个指向整型指针的数组的指针,指针类型为`int *(*)[4]`,指向的类型为`...

    C语言指针及答案

    因此,可以使用指针运算来访问数组元素,例如,`*p` 访问 `p` 所指向的元素,`p + i` 访问第 `i` 个元素。 通过以上解析,我们可以看到,C语言中的指针是极其强大但也容易出错的特性。掌握好指针的基本概念和使用...

    C语言指针课程PPT

    【C语言指针课程PPT】讲解了C语言中核心的指针概念,它是C语言高效编程的关键。指针允许程序直接访问内存地址,增强了代码的灵活性和性能。以下是关于指针的详细知识点: 1. **变量与内存地址**: - 当在C语言中...

    深入理解C语言指针.pdf

    "深入理解C语言指针" 在C语言中,指针是一个...因此,为了更好地理解C语言指针,我们需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。

    c语言指针详解,10分钟学会指针用法

    本篇文章将详细介绍C语言指针的基本概念、指针的声明和使用、数组指针的加减运算、指针之间的运算、指针之间的大小比较、数组作为参数传递给函数等知识点。 一、指针的基本概念 在C语言中,指针是一种数据类型,它...

    C语言 指针学习的笔记

    这里的加减运算并不简单地增加或减少数值,而是根据指针所指向的类型按字节数移动。例如,对于`int*ptr`,`ptr++`会使ptr的值增加`sizeof(int)`个字节,从而指向下一个整型变量的位置。这对于遍历数组特别有用,如例...

    c语言指针习题及答案

    ### C语言指针知识点解析 #### 一、理解指针的基本概念 在C语言中,指针是一个非常重要的概念,它允许程序员直接控制和管理内存。指针是一种变量,其值为另一个变量的地址(即内存位置)。通过使用指针,可以更...

    C语言指针变量的运算_C语言中文网1

    当我们对这些指针进行加1或减2的操作时,它们的地址并不是简单地加1或减2,而是根据对应类型的数据大小来增加或减少。这是因为指针运算实际上是基于数据类型长度的偏移。 例如,对于`int`类型(假设为4字节),`pa+...

    指针详解——介绍C语言指针,看过这个,笔试无忧

    《指针详解——C语言指针完全解析》 在C语言的世界中,指针是一个强大的工具,也是理解和掌握C语言的关键。本文将深入探讨指针的概念、类型、运算及其在笔试中的重要性。 首先,我们要了解什么是指针。指针是一个...

    c语言指针(精辟详讲)

    在算术运算中,这个类型尤为重要,因为指针加减整数时会基于此类型计算偏移量。 3. 指针的值:指针的值即指针所存储的内存地址,这通常是一个32位或64位的数值,取决于系统的地址宽度。例如,`ptr`的值可能是内存中...

    掌握C语言指针的好方法

    指针类型转换是指将一种类型的指针转换为另一种类型的指针。例如,可以将`int *`类型的指针转换为`char *`类型。需要注意的是,虽然这种转换是合法的,但在某些情况下可能会导致未定义的行为,尤其是在指针指向的...

    C语言指针详解(让你不再惧怕指针)

    在指针加减运算中,可以对指针进行整数递增或递减,这会改变指针所指向的位置,但必须确保指针仍然在合法内存范围内。 指针在数组和字符串中的应用广泛。数组名实质上是其首元素的地址,因此可以将数组名赋值给指针...

    C语言指针部分(C语言指针)

    在进行指针运算时,如加减运算,这个类型会决定增加或减少的字节数。 3. 指针的值:指针存储的内存地址。未初始化的指针没有明确的值,指向的内存区域也无意义。一旦指针被赋值,其值就是一个内存地址,表示它指向...

    C语言指针题库

    C语言指针题库 本资源摘要信息是关于C语言指针的题库,涵盖了计算机等级二级考试中的相关内容。该资源包含选择题和编程题,旨在帮助考生和学习者提高C语言指针的知识和技能。 指针基本概念 在C语言中,指针是一种...

    精选C语言指针资料大全

    - 指针运算:学习指针的算术运算,包括加减操作以及它们在数组和字符串中的应用。 - 函数指针:理解函数指针的概念,如何声明和使用函数指针,以及它们在回调函数和模式匹配中的角色。 - 指针与数组的关系:探究...

Global site tag (gtag.js) - Google Analytics