| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2499 人关注过本帖, 1 人收藏
标题:小鱼儿浅谈指针
取消只看楼主 加入收藏
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
结帖率:95.74%
收藏(1)
 问题点数:0 回复次数:12 
小鱼儿浅谈指针
c语言的指针可以说c语言灵魂,自己也学c一年多了说不精通,但还是有点解了(有些东西用的少还是不了解)。
看到好多新手对指针不能理解,有些人学c了 学了指针但还是不知道怎么一回事情。好多人觉得学数据结构实在
难,大多原因是他们没有弄白指针。因为数据结构用c表示的话 90%都要用指针 其实可以说100% 都要用到。
数组难道不指针吗!!! 几乎数组可以和指针互换。
比喻说 int *p;  和int p[]; 你调用指针的时候可以用p[n] n为一个合理的整数。 你用数组的时候可以用 int *c=&s[0];
  *c++;来调用。因为数组的数组名是固定的。他的地址是不能修改了 你不能s++  这样编译器是会报错的。
 
但数组比指针更容易理解。但指针的效率要比数组快,因为数组最终还是转换为指针(不记得是在那本书上看到过的)。
所以指针 数组各有好处。
 
指针的缺点就不说了,反正就是太灵活了,搞他不定人就容易出现大麻烦。
 
指针到底是什么。
 
我开始学c 一直不明白到底是什么,还到那里傻不拉唧的以为明白了指针是何物。当有一天和网上的高手和写一个项目的时候,
看他写的通用链表(这个链表写的有点像树,单向链表套用单向链表)。我开始以为看明白了,等我仔细分析他的代码,我才发现
我连指针是什么都不知道。
我开始以为
int *p; 和 char *p;  的区别就是
生存一个4个字节的内存来存放一个数据。 和 生存一个1个字节内存来存放数据。
 
现在看来真的好可笑啊。。
 
现在我认为指针是什么呢。
就是一个存放一个32整数数值的变量而已(在32位系统中);
不要被他的星号迷惑。int *p1; 和int p2;可以说在一些情况可以相同。p1=&a;(一个整数的变量a的110(假设的));
p2=110;可以说等价的。但现实中你不能这样做,你不能把一个地址直接赋值一个变量。
然后*p2来调用对应地址的数据。 这样是行的。我自己实验过。现在在别人家没有编程的工具 不好贴代码。
但你一可以直接赋值一个指针 来调用是可以的。p1=110; 这样是可以的。 不可以就奇怪了。从这点看出来 *  只是为了告诉编译器他是指针 你必须用指针的方式来调用他,申明类型也是这个道理, int a ; 和 char a ;  和 int *a;  和char *a; 只是告诉编译是怎么处理这些数据而已。说到底这些数据本质都是0 1 所以只是编译器怎么处理而已。不同的处理表示的含义就不同了。
 
从上面可以推出。
int *p  和 int * *p;
本质没有差别。
都是指针。
二级 和n 级指针都可以看成一级指针。放着内存的地址而已。只是编译器的处理方式不同而已。
 
上面自己简单谈了自己对指针的看法,自己的技术很菜,自己随便谈一下自己的指针认识。如果有些东西实在错了 欢迎指正。
 
然后谈一下看书。
 
反正高手都是推荐看外国的书。自己国内 国外都看过。确实外国要比中国写的好。写的认真。。。。。。。中国没有办法,大多是向钱看,所以好多书写的不准确。 而中国的学生又喜欢把书上的东西当成圣旨来看的。有些地方可能作者随便说的一句话,他却当真了,当他跟别的书上 或者别人说的产生矛盾。这样他自己都不知道谁对 谁错了。
所以说 书上的不可全信,通过自己动手实践了,然后思考 自然会得出一个正确的答案。
你可以先看中国的书 但不要全信,然后在看一下外国的书。比较加分析 你自然会明白谁对谁错了。这样你自己也会进步很快。


[ 本帖最后由 小鱼儿c 于 2012-1-17 03:27 编辑 ]
搜索更多相关主题的帖子: 小鱼儿 东西 c语言 
2012-01-17 02:18
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
发帖没有别的意思,只是在家这几天帮人做结婚的视频。
没有写代码。也没有学习。。
然后闲的慌,自己逛的一些论坛。貌似好多新手对指针不太了解。

自己就是随便谈谈指针的认识。。。希望大家不要走像对指针错误弯路而已。。。

希望和大家共同进步。。。

新年快乐。。。。。。
hellovfp 快乐。。。。。。。。。。。

用心做一件事情就这么简单
2012-01-17 02:23
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用love24114在2012-1-17 10:23:41的发言:

线性栈用不到……
不知道你用什么申请内存呢。

用什么保存内存地址。

是用数组 还是 方法呢!!
望指点。。。

用心做一件事情就这么简单
2012-01-17 11:52
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用smallmoon521在2012-1-17 08:05:08的发言:

顶,不错如果int* p;这么写,是否就不会有迷惑了呢?
或许吧!!!!呵呵

用心做一件事情就这么简单
2012-01-17 11:52
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用love24114在2012-1-17 14:02:18的发言:

struct STACK{
int data[100];
int top = -1;
}mystack;



你看看我说的这句话

数组难道不指针吗!!! 几乎数组可以和指针互换。
比喻说 int *p;  和int p[]; 你调用指针的时候可以用p[n] n为一个合理的整数。 你用数组的时候可以用 int *c=&s[0];
  *c++;来调用。因为数组的数组名是固定的。他的地址是不能修改了 你不能s++  这样编译器是会报错的。

但数组比指针更容易理解。但指针的效率要比数组快,因为数组最终还是转换为指针(不记得是在那本书上看到过的)。
所以指针 数组各有好处。


你的一百最好定义一个常量或者一个宏。。。
多是用一下typedef 这个东西方便点。。。

用心做一件事情就这么简单
2012-01-17 14:27
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用love24114在2012-1-17 14:02:18的发言:

struct STACK{
int data[100];
int top = -1;
}mystack;



你看看我说的这句话

数组难道不指针吗!!! 几乎数组可以和指针互换。
比喻说 int *p;  和int p[]; 你调用指针的时候可以用p[n] n为一个合理的整数。 你用数组的时候可以用 int *c=&s[0];
  *c++;来调用。因为数组的数组名是固定的。他的地址是不能修改了 你不能s++  这样编译器是会报错的。

但数组比指针更容易理解。但指针的效率要比数组快,因为数组最终还是转换为指针(不记得是在那本书上看到过的)。
所以指针 数组各有好处。


你的一百最好定义一个常量或者一个宏。。。
多是用一下typedef 这个东西方便点。。。


你的一百最好定义一个常量或者一个宏。。。
多是用一下typedef 这个东西方便点。。。
以下是引用love24114在2012-1-17 14:02:18的发言:

struct STACK{
int data[100];
int top = -1;
}mystack;



你看看我说的这句话

数组难道不指针吗!!! 几乎数组可以和指针互换。
比喻说 int *p;  和int p[]; 你调用指针的时候可以用p[n] n为一个合理的整数。 你用数组的时候可以用 int *c=&s[0];
  *c++;来调用。因为数组的数组名是固定的。他的地址是不能修改了 你不能s++  这样编译器是会报错的。

但数组比指针更容易理解。但指针的效率要比数组快,因为数组最终还是转换为指针(不记得是在那本书上看到过的)。
所以指针 数组各有好处。


你的一百最好定义一个常量或者一个宏。。。
多是用一下typedef 这个东西方便点。。。


你的一百最好定义一个常量或者一个宏。。。
多是用一下typedef 这个东西方便点。。。

[ 本帖最后由 小鱼儿c 于 2012-1-17 14:37 编辑 ]

用心做一件事情就这么简单
2012-01-17 14:32
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
回复 11楼 love24114
呵呵,c++ 我才是学一点东西。
STL 不懂,没有看过。
嘿嘿。。。

用心做一件事情就这么简单
2012-01-17 14:46
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用love24114在2012-1-17 14:49:37的发言:

stack基本上就是用数组去实现的,
没有用到指针就是没有用到指针。
不要去解释。top起到索引作用
用不到指针,数据结构并不是完全用到指针,
而且数据结构中的指针也并不是很难。
难的是指针数组,数组指针结合起来的东西,
比如(*p)[2]和*p[2]的区别。



既然你这样想也没有办法。
你找一本关于指针的书说是怎么说的
再说吧。。。
stack基本上就是用数组去实现的
我觉得这句话很不妥。。理由我想大家都明白。

比如(*p)[2]和*p[2]的区别。

你说出这句话 我真被你一下子雷到了。
我不知道高手看到你说出这句话 会怎么想你。。。。。。

用心做一件事情就这么简单
2012-01-17 14:55
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
我到网上找的一篇文章,你看了之后 你觉得呢。

[转]这篇文章摘自网易广州社区的C语言版精华区。文章不错,不敢独享!作者girlrong是以前C语言版版主,她乐于助人,虚心诚恳,颇受网友欢迎。只可惜现在已退隐江湖了。  
 

第一章。指针的概念

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。  

先声明几个指针放着做例子:  

例一:  

(1)int *ptr;  

(2)char *ptr;  

(3)int **ptr;  

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

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

如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解c和c  

++的复杂类型声明>>。  

 

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]  

在指针的算术运算中,指针所指向的类型有很大的作用。  

指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。

3。 指针的值,或者叫指针所指向的内存区或地址。  

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。  

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

指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。  

以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的类型是什么?该指针指向了哪里?  

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

指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。

指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。  

第二章。指针的算术运算

 

指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:  

例二:  

1。 char a[20];  

2。 int *ptr=a;  

...  

...  

3。 ptr++;  

在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。

由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。

我们可以用一个指针和一个循环来遍历一个数组,看例子:  

例三:  

int array[20];  

int *ptr=array;  

...  

//此处略去为整型数组赋值的代码。  

...  

for(i=0;i<20;i++)  

{  

(*ptr)++;  

ptr++;  

}  

这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。再看例子:  

例四:  

1。 char a[20];  

2。 int *ptr=a;  

...  

...  

3。 ptr+=5;  

在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。  

如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。  

总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

 

第三章。运算符&和*

 

这里&是取地址运算符,*是...书上叫做“间接运算符”。&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。*p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

例五:  

int a=12;  

int b;  

int *p;  

int **ptr;  

p=&a;//&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。  

*p=24;//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a。

ptr=&p;//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int**。该指针所指向的类型是p的类型,这里是int*。该指针所指向的地址就是指针p自己的地址。  

*ptr=&b;//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以?amp;b来给*ptr赋值就是毫无问题的了。

**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。

 

第四章。指针表达式。

 

一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。下面是一些指针表达式的例子:  

例六:  

int a,b;  

int array[10];  

int *pa;  

pa=&a;//&a是一个指针表达式。  

int **ptr=&pa;//&pa也是一个指针表达式。  

*ptr=&b;//*ptr和&b都是指针表达式。  

pa=array;  

pa++;//这也是指针表达式。  

例七:  

char *arr[20];  

char **parr=arr;//如果把arr看作指针的话,arr也是指针表达式  

char *str;  

str=*parr;//*parr是指针表达式  

str=*(parr+1);//*(parr+1)是指针表达式  

str=*(parr+2);//*(parr+2)是指针表达式  

由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。 在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr这个指针已经占据了内存,其实*ptr就是指针pa,既然pa已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。

 

第五章。数组和指针的关系

 

如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文章<<如何理解c和c++的复杂类型声明>>。 数组的数组名其实可以看作一个指针。看下例:  

例八:  

int array[10]={0,1,2,3,4,5,6,7,8,9},value;  

...  

...  

value=array[0];//也可写成:value=*array;  

value=array[3];//也可写成:value=*(array+3);  

value=array[4];//也可写成:value=*(array+4);  

上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。  

例九:  

char *str[3]={  

"Hello,this is a sample!",  

"Hi,good morning.",  

"Hello world"  

};  

char s[80];  

strcpy(s,str[0]);//也可写成strcpy(s,*str);  

strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));  

strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));  

上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。

*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即'H'的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char *。  

*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good morning."的第一个字符'H',等等。  

下面总结一下数组的数组名的问题。声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE [n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。  

在不同的表达式中数组名array可以扮演不同的角色。  

在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。  

在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。  

表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。  

例十:  

int array[10];  

int (*ptr)[10];  

ptr=&array;  

上例中ptr是一个指针,它的类型是int (*)[10],他指向的类型是int [10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。  

本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:

int (*ptr)[10];  

则在32位程序中,有:  

sizeof(int(*)[10])==4  

sizeof(int [10])==40  

sizeof(ptr)==4  

实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。  

第六章。指针和结构类型的关系

 

可以声明一个指向结构类型对象的指针。  

例十一:  

struct MyStruct  

{  

int a;  

int b;  

int c;  

}  

MyStruct ss={20,30,40};//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。

MyStruct *ptr=&ss;//声明了一个指向结构对象ss的指针。它的类型是

MyStruct*,它指向的类型是MyStruct。

int *pstr=(int*)&ss;//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。

请问怎样通过指针ptr来访问ss的三个成员变量?  

答案:  

ptr->a;  

ptr->b;  

ptr->c;  

又请问怎样通过指针pstr来访问ss的三个成员变量?  

答案:  

*pstr;//访问了ss的成员a。  

*(pstr+1);//访问了ss的成员b。  

*(pstr+2)//访问了ss的成员c。  

呵呵,虽然我在我的MSVC++6.0上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:  

例十二:  

int array[3]={35,56,37};  

int *pa=array;  

通过指针pa访问数组array的三个单元的方法是:  

*pa;//访问了第0号单元  

*(pa+1);//访问了第1号单元  

*(pa+2);//访问了第2号单元  

从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。

所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个“填充字节”,这就导致各个成员之间可能会有若干个字节的空隙。

所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。  

通过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法。

 

第七章。指针和函数的关系

 

 

可以把一个指针声明成为一个指向函数的指针。  

int fun1(char*,int);  

int (*pfun1)(char*,int);  

pfun1=fun1;  

....  

....  

int a=(*pfun1)("abcdefg",7);//通过函数指针调用函数。  

可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参

用心做一件事情就这么简单
2012-01-17 15:02
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用love24114在2012-1-17 15:26:15的发言:

指针数组你也没看到啊?
翻书去,几乎有点技术含量的书都会说道
(*p)[]和*p[]的区别


我不知道
我上面说了他们是一样吗!!

你连别人写的帖子都看不懂。。。。

别人写帖子一定要说
(*p)[]和*p[]有区别才可以了吗??

不要在这里丢人好不呢!!

开始给你留了面子。。。。

你叫一个有脑子看看这个贴子好不好。。。。

看不懂不要这里叫好不呢。。。
我是说我复制那个帖子。。。。。

我不说我的帖子,可能说的有问题,你看看我上面随便找的一个帖子是怎么说的,你先仔细的看看好不呢。。
你脑残也不要全世界的人都知道好吗??给自己留点面子。
抱歉说了实话,没办法 对付你这种人 不用脑袋思考的人 我实在没有办法控制自己情绪。你说不看我的帖子就算了,
你也看看我给你复制的帖子好吗!!人家那么仔细写了那么多,那么好。。你不明白就算了,还在这里乱叫。有意思吗,
吃多了啊。。。。
就算版主封了我帖子 我也要说,不尊重别人的人,我对你也没有什么好尊重的。。。

等你脑袋有一点正常好可以吗,有一点逻辑就知道别人写是什么。。。。
想不到遇到你这样白痴。唉,没有办法。

连一个人说stack 基本都是数组的人 我真不知道和你这里和你谈有意思。。。
没事 给我闪到一边去。。。。。。
以下是引用love24114在2012-1-17 15:26:15的发言:

指针数组你也没看到啊?
翻书去,几乎有点技术含量的书都会说道
(*p)[]和*p[]的区别


我不知道
我上面说了他们是一样吗!!

你连别人写的帖子都看不懂。。。。

别人写帖子一定要说
(*p)[]和*p[]有区别才可以了吗??

不要在这里丢人好不呢!!

开始给你留了面子。。。。

你叫一个有脑子看看这个贴子好不好。。。。

看不懂不要这里叫好不呢。。。
我是说我复制那个帖子。。。。。

我不说我的帖子,可能说的有问题,你看看我上面随便找的一个帖子是怎么说的,你先仔细的看看好不呢。。
你脑残也不要全世界的人都知道好吗??给自己留点面子。
抱歉说了实话,没办法 对付你这种人 不用脑袋思考的人 我实在没有办法控制自己情绪。你说不看我的帖子就算了,
你也看看我给你复制的帖子好吗!!人家那么仔细写了那么多,那么好。。你不明白就算了,还在这里乱叫。有意思吗,
吃多了啊。。。。
就算版主封了我帖子 我也要说,不尊重别人的人,我对你也没有什么好尊重的。。。

等你脑袋有一点正常好可以吗,有一点逻辑就知道别人写是什么。。。。
想不到遇到你这样白痴。唉,没有办法。

连一个人说stack 基本都是数组的人 我真不知道和你这里和你谈有意思。。。
没事 给我闪到一边去。。。。。。
以下是引用love24114在2012-1-17 15:26:15的发言:

指针数组你也没看到啊?
翻书去,几乎有点技术含量的书都会说道
(*p)[]和*p[]的区别


我不知道
我上面说了他们是一样吗!!

你连别人写的帖子都看不懂。。。。

别人写帖子一定要说
(*p)[]和*p[]有区别才可以了吗??

不要在这里丢人好不呢!!

开始给你留了面子。。。。

你叫一个有脑子看看这个贴子好不好。。。。

看不懂不要这里叫好不呢。。。
我是说我复制那个帖子。。。。。

我不说我的帖子,可能说的有问题,你看看我上面随便找的一个帖子是怎么说的,你先仔细的看看好不呢。。
你脑残也不要全世界的人都知道好吗??给自己留点面子。
抱歉说了实话,没办法 对付你这种人 不用脑袋思考的人 我实在没有办法控制自己情绪。你说不看我的帖子就算了,
你也看看我给你复制的帖子好吗!!人家那么仔细写了那么多,那么好。。你不明白就算了,还在这里乱叫。有意思吗,
吃多了啊。。。。
就算版主封了我帖子 我也要说,不尊重别人的人,我对你也没有什么好尊重的。。。

等你脑袋有一点正常好可以吗,有一点逻辑就知道别人写是什么。。。。
想不到遇到你这样白痴。唉,没有办法。

连一个人说stack 基本都是数组的人 我真不知道和你这里和你谈有意思。。。
没事 给我闪到一边去。。。。。。
以下是引用love24114在2012-1-17 15:26:15的发言:

指针数组你也没看到啊?
翻书去,几乎有点技术含量的书都会说道
(*p)[]和*p[]的区别


我不知道
我上面说了他们是一样吗!!

你连别人写的帖子都看不懂。。。。

别人写帖子一定要说
(*p)[]和*p[]有区别才可以了吗??

不要在这里丢人好不呢!!

开始给你留了面子。。。。

你叫一个有脑子看看这个贴子好不好。。。。

看不懂不要这里叫好不呢。。。
我是说我复制那个帖子。。。。。

我不说我的帖子,可能说的有问题,你看看我上面随便找的一个帖子是怎么说的,你先仔细的看看好不呢。。
你脑残也不要全世界的人都知道好吗??给自己留点面子。
抱歉说了实话,没办法 对付你这种人 不用脑袋思考的人 我实在没有办法控制自己情绪。你说不看我的帖子就算了,
你也看看我给你复制的帖子好吗!!人家那么仔细写了那么多,那么好。。你不明白就算了,还在这里乱叫。有意思吗,
吃多了啊。。。。
就算版主封了我帖子 我也要说,不尊重别人的人,我对你也没有什么好尊重的。。。

等你脑袋有一点正常好可以吗,有一点逻辑就知道别人写是什么。。。。
想不到遇到你这样白痴。唉,没有办法。

连一个人说stack 基本都是数组的人 我真不知道和你这里和你谈有意思。。。
没事 给我闪到一边去。。。。。。

[ 本帖最后由 小鱼儿c 于 2012-1-17 16:22 编辑 ]

用心做一件事情就这么简单
2012-01-17 16:12
快速回复:小鱼儿浅谈指针
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020734 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved