C指针解析 ------ 指针的概念及要素

  本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020

   

   指针在C语言中的地位,不用多说。

指针的概念

   指针是一个特殊的变量,它里面存储的数值被解释成为内存中的一个地址。指针有四个要素,分别是指针的类型,指针所指向的类型,指针的值或者指针所指向的内存区,还有指针本身所占据的内存区。所以要理解指针,就必须要搞清楚这四个要素。下面分别来说。

 

   先来看一个例子,通过例子来直观的看指针这四个要素到底代表什么:

例1.

(1) int *ptr;

(2) char *ptr;

(3) int **ptr;

(4) int (*ptr)[3];

(5) int *(*ptr)[4];

指针的四要素

1. 指针的类型

   从语法的角度看,要得到指针的类型,只需要把指针声明语句里的指针名字取掉即可,而剩下的部分就是这个指针的类型,这是指针本身所具有类型,和指针所指向的类型不同。按这样的解释来看上面例子各指针的类型:

   (1) int *ptr;           // 指针的类型为int*

(2) char *ptr;       //  指针的类型为char*

(3) int **ptr;        // 指针的类型为int**

(4) int (*ptr)[3];   // 指针的类型为int (*)[3]

(5) int *(*ptr)[4];  // 指针的类型为int *(*)[4]

2. 指针所指向的类型

当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将那片内在区里的内容当做什么来看待。

从语法的角度看,要得到指针所指向的类型,只需要把指针声明语句中的指针名字和名字左边的的指针声明符*去掉即可,而剩下的部分就是指针所指向的类型。这样解释后再来看上面的例子中各指针所指向的类型:

(1)int *ptr;           // 指针所指向的类型为int

(2) char *ptr;       //  指针所指向的类型为char

(3) int **ptr;        // 指针所指向的类型为int*

(4) int (*ptr)[3];   // 指针所指向的类型为int ()[3]

(5) int *(*ptr)[4];  // 指针所指向的类型为int *()[4]

   注意:

     指针的类型(即指针本身的类型)和指针所指向的类型是两个不同的概念,根据其识别方法来区别两者。

3. 指针的值

指针的值,也叫做指针所指向的内存地址或内存区。

    指针的值是指指针本身存储的值,这个值将被编译器当作一个地址,而不是一个一般的数值,在32位的程序里,所有类型的指针的值都是一个32位整数.。如果是64位系统,则指针的值就是一个64的位整数。

指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。通常我们说一个指针的值是x,则相当于说明了该指针指向了以x为首地址的内存区域,就相当于说该指针的值就是这块内存区域的首地址。

   注意:

     指针所指向的内存区和指针所指向的类型是两个完全不同的概念。就拿上面的例子来说,指针所指向的类型已经有了,但是由于指针并未初始化,所以它所指向的内存区是不存在的。

4. 指针本身所占据的内存区

指针本身占了多少内存,可以用sizeof(指针的类型)就可以知道了,在32位系统里,指针本身占了4个字节的长度。

以上就是关于指针的概念及指针的四个要素,这对于理解指针,及对于指针的操作来说至关重要。

时间: 2024-08-24 18:32:37

C指针解析 ------ 指针的概念及要素的相关文章

C指针解析 ------ 指针的算术运算

本文是自己学习所做笔记.欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 指针是一个特殊的变量,表示一个地址,而地址能够上减去或加上一个整数,从而能够表示新的地址. 以下通过一段代码来分析指针的算术运算: #include <stdio.h> int main(){ int i; char str[]={'a','b','c','d','e'}; int *p = str; char *q = str; q++; p++; printf("

C指针解析 ------ 指针表达式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 所谓的指针表达式是指一个表达式,其结果是一个指针. 例1. int  a,b; int array[20]; int *p; p = &a;             //&a 就是一个指针表达式,因为&a的结果就是一个指针. int **q = &p;     //&p也是一个指针表达式. *q = &b;            //*p和

右左法则----复杂指针解析

核心提示:因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则是一个既着名又常用的方法 因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则是一个既着名又常用的方法.不过,右左法 则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法.C标准的声明规则,是用来解决如何创建声明的,而右左法则是用 来解决如何辩识一个声明的,两者可以说是相反的.右左法则的英文原文是这样说的: The right-left rule:

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

指针理解——复杂指针解析

右左法则 首先从最里面的圆括号看起,然后往右看,再往左看,每当遇到圆括号时,就应该调转阅读方向,一旦解析完圆括号里面的所有东西,就跳出圆括号,重复这个过程直到整个声明解析完毕. 举例:int * (* (*fun) (int *)) [10] 首先,fun是一个指针,因为他先跟*(绿色色)结合.fun指向的是一个函数,该函数特点是有一个整形指针做参数,并且返回值仍然是一个指针(品红色).其返回值指针指向的内容是个数组.所指向的数组有10个元素,每个元素都是int *类型. 练习: 用变量a给出下

解析 指针数组,数组指针,函数指针

一 :关于指针和堆的内存分配 指针数组 : 一个数组里放的都是指针,我们把他叫做指针数组 int * a[10]; 由于它是一个数组,他是不能从堆空间里申请空间的. 只能做个循环,每个元素去申请空间,或者每个元素去指向另外的地址空间. 数组指针 : 一个指向一唯或者多唯数组的指针: int * b=new int[10]; 指向一唯数组的指针b ; 一些例子: int (*b2)[10]=new int[10][10]; 注意,这里的b2指向了一个二唯int型数组的首地址. 注意,这里的b2的类

C指针解析 ------ 运算符&amp;和*

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 & 是取地址运算符,* 叫做指针运算符或间接运算符.&a 的运算结果是一个指针,指针的类型是a的类型加上*,指针所指向的类型是a的类型,指针的值也就是指针所指向的内存区就是a的地址. *p的运算结果就多了,总之,*p的结果是p所指向的东西,这个东西有这些特点: 它的类型是p所指向的类型,它所占用的地址是p所指向的地址. 看下面的例子: int a = 5; int b;

指针热身——指针基础概念

#include <stdio.h> int main(void) { //注:指针=地址,指针就是地址,地址就是指针,只是名字不同而已. int * p;     //p是变量的名字,int * 表示该变量p指向存放int类型变量的地址 //int * p; 不表示定义了一个变量为*p的整型变量,而是定义了一个int*类型的变量p //int *p; 应该这样理解,定义了一个变量名p,他的类型是int*类型,实际上就是存放了一个类型为int的地址 int i=3; //  i是整型,因此指向

【转】让你不再害怕指针——C指针详解(经典,非常详细)

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧: [cpp] view plain copy int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,