指针讲解
近日被指针弄的糊里糊涂的……特别是与多维数组或函数结合后,就更晕了!哪位高手能结合实例讲解一下……多谢赐教!!!
作者: csxuedn 发布时间: 2011-06-13
你到网上查吧,多维数组指针,而且有本书是专门讲指针的,可以找找
作者: bdmh 发布时间: 2011-06-13
强烈建议lz找本c和指针的书看。
作者: dizuo 发布时间: 2011-06-13
多谢多谢……
作者: csxuedn 发布时间: 2011-06-13
刚接触指针,请问看什么书比较好?专讲指针的```
作者: Libylovexixi 发布时间: 2011-06-13
看C和指针撒
作者: sanshao1314 发布时间: 2011-06-13
首先,可以说说,指针的实质代表了两样东西:
1、指针本身,普通的指针变量本身也是一个变量,其所在内存存储的值是一个地址,而对于此地址的解释与指针类型相关,比如,char *ch;ch是一个指向char类型的指针变量,该指针的值是一个char类型变量的地址。(当然了,指针也有 const char *ch;和 char * const ch;这样的。前者是限定了写权限,只读指针,不能通过该指针改变所指向变量或常量的值,但是本身的指向对象可以改变,后者是本身的值,即其指向的地址不能改变,所以要求在定义该类指针的时候要给出初始化,但是这类指针却可以改变其所指对象的值。)
2、指针所指向的对象。对指针解引用后就可以得到其所指向变量的值,如上述ch指针,*ch便表示其所指向的char型变量值。
明白了上述两点基本知识后,就可以很好的理解指针的实质。
对于多维数组,就拿常见的二维数组为例。
int array[5][6]; // 这是一个5行6列的整型数组
首先应该明白,数组名本身是一个常量指针,array代表的是整个二维数组的首地址,array的值是绝对不允许改变的。
另外,对于二维数组的指针操作可以有两种方式,第一,就是普通对应类型的指针,第二,就是行指针。
1、普通指针,就是,如上面提到的array数组,是整型数组,所以可以定义指针 int *p = array;或者 int *p = &array[0][0];来表示p初始化为array数组的首地址,即首元素的地址。但是这样的指针会因为数组的多维导致操作起来不是很直观。所以,对于二维数组,引入了行指针。
2、行指针。行指针的定义拿刚刚的例子来说可以是这样:int (*p)[6] = array; 从该定义可以看出,行指针只是定义出该行指针所指向的二维数组有多少列,并没有限定行数,即该行指针p是一个指向拥有6列的整型数组,数组的行数并没有限定。也就是说这个行指针p可以指向诸如 array[3][6],array[9][6]等等这样的数组,它们都是拥有6列的整型二维数组。对于 p++,或者 p = p + 1的操作,意义就是该行指针p从当前行移动到下一行,因为行指针本身是指向二维数组每一行的行首地址的指针,所以做加法运算的时候,只是在行间首地址移动。如果想通过行指针去操作任意的数组元素,可以采用这样的格式:*(*(p+a)+b),这样的意义就是array[a][b]这个元素(前提是,a和b均不会导致越界读写)。另外,还要强调的一点,就是 p+a 和 *(p+a) 的意义是一样的,虽然后者多了一个解引用符号。这一点可以这样理解,p本身是一个行指针,p+a的意义是第a行的行首地址,另外理解*(p+a),,对于一维数组,这样的表达式,表示的是array[a]的值,对于二维数组,同样表示array[a]的值,只是,二维数组里,array[a]不占内存单元,只是一种地址计算的方式。那么既然*(p+a)也表示array[a]的值,array[a]的值自然就是第a行的行首地址。因此,*(p+a)的意义就是array[a][0]的首地址,即第a行的行首地址。
对于,函数,也是一样的理解。函数名本身就是函数的地址,对于 int func(int ,char ,...);这样的函数,可以定义个函数指针指向这种函数原型,即 int (*p) (int ,char ,...);
1、指针本身,普通的指针变量本身也是一个变量,其所在内存存储的值是一个地址,而对于此地址的解释与指针类型相关,比如,char *ch;ch是一个指向char类型的指针变量,该指针的值是一个char类型变量的地址。(当然了,指针也有 const char *ch;和 char * const ch;这样的。前者是限定了写权限,只读指针,不能通过该指针改变所指向变量或常量的值,但是本身的指向对象可以改变,后者是本身的值,即其指向的地址不能改变,所以要求在定义该类指针的时候要给出初始化,但是这类指针却可以改变其所指对象的值。)
2、指针所指向的对象。对指针解引用后就可以得到其所指向变量的值,如上述ch指针,*ch便表示其所指向的char型变量值。
明白了上述两点基本知识后,就可以很好的理解指针的实质。
对于多维数组,就拿常见的二维数组为例。
int array[5][6]; // 这是一个5行6列的整型数组
首先应该明白,数组名本身是一个常量指针,array代表的是整个二维数组的首地址,array的值是绝对不允许改变的。
另外,对于二维数组的指针操作可以有两种方式,第一,就是普通对应类型的指针,第二,就是行指针。
1、普通指针,就是,如上面提到的array数组,是整型数组,所以可以定义指针 int *p = array;或者 int *p = &array[0][0];来表示p初始化为array数组的首地址,即首元素的地址。但是这样的指针会因为数组的多维导致操作起来不是很直观。所以,对于二维数组,引入了行指针。
2、行指针。行指针的定义拿刚刚的例子来说可以是这样:int (*p)[6] = array; 从该定义可以看出,行指针只是定义出该行指针所指向的二维数组有多少列,并没有限定行数,即该行指针p是一个指向拥有6列的整型数组,数组的行数并没有限定。也就是说这个行指针p可以指向诸如 array[3][6],array[9][6]等等这样的数组,它们都是拥有6列的整型二维数组。对于 p++,或者 p = p + 1的操作,意义就是该行指针p从当前行移动到下一行,因为行指针本身是指向二维数组每一行的行首地址的指针,所以做加法运算的时候,只是在行间首地址移动。如果想通过行指针去操作任意的数组元素,可以采用这样的格式:*(*(p+a)+b),这样的意义就是array[a][b]这个元素(前提是,a和b均不会导致越界读写)。另外,还要强调的一点,就是 p+a 和 *(p+a) 的意义是一样的,虽然后者多了一个解引用符号。这一点可以这样理解,p本身是一个行指针,p+a的意义是第a行的行首地址,另外理解*(p+a),,对于一维数组,这样的表达式,表示的是array[a]的值,对于二维数组,同样表示array[a]的值,只是,二维数组里,array[a]不占内存单元,只是一种地址计算的方式。那么既然*(p+a)也表示array[a]的值,array[a]的值自然就是第a行的行首地址。因此,*(p+a)的意义就是array[a][0]的首地址,即第a行的行首地址。
对于,函数,也是一样的理解。函数名本身就是函数的地址,对于 int func(int ,char ,...);这样的函数,可以定义个函数指针指向这种函数原型,即 int (*p) (int ,char ,...);
作者: BobYy69 发布时间: 2011-06-13