求个指针走到1926就停止了指到1年的

【图文】8.1 指针_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
大小:88.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢静态的声明一个指针变量
我是从的GPS模拟器代码中看到的,觉得很有意思,就记录下来了
首先是结构体的定义:
/* this is the state of our connection to the qemu_gpsd daemon */&
typedef struct {&
&&& int&&&&&&&&&&&&&&&&&&&&&
&&& int&&&&&&&&&&&&&&&&&&&&&
&&& GpsCallbacks&&&&&&&&&&&&
&&& pthread_t&&&&&&&&&&&&&&&
&&& int&&&&&&&&&&&&&&&&&&&& control[2];&
/* this is the state of our connection to the qemu_gpsd daemon */
typedef struct {
&&& int&&&&&&&&&&&&&&&&&&&&
&&& int&&&&&&&&&&&&&&&&&&&&
&&& GpsCallbacks&&&&&&&&&&&
&&& pthread_t&&&&&&&&&&&&&&
&&& int&&&&&&&&&&&&&&&&&&&& control[2];
然后声明结构体指针变量
static GpsState& _gps_state[1];
正常使用:
static int&
qemu_gps_init(GpsCallbacks* callbacks)&
&&& GpsState*& s = _gps_&
&&& if (!s-&init)&
&&&&&&& gps_state_init(s, callbacks);&
&&& if (s-&fd & 0)&
&&&&&&& return -1;&
&&& return 0;&
static int
qemu_gps_init(GpsCallbacks* callbacks)
&&& GpsState*& s = _gps_
&&& if (!s-&init)
&&&&&&& gps_state_init(s, callbacks);
&&& if (s-&fd & 0)
&&&&&&& return -1;
&&& return 0;函数的参数是一个指针, 不要指望用该指针去申请动态内存
我的图书馆
函数的参数是一个指针, 不要指望用该指针去申请动态内存
程序1:void myMalloc(char *s) //我想在函数中分配内存,再返回{s=(char *) malloc(100);}void main(){char *p=NULL;myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么?if(p) free(p);}程序2:void myMalloc(char **s){*s=(char *) malloc(100);}void main(){char *p=NULL;myMalloc(&p); //这里的p可以得到正确的值了if(p)&free(p);}程序3:#include&stdio.h&void fun(int *p){int b=100;p=&b;}main(){int a=10;int *q;q=&a;printf("%d\n",*q);fun(q);printf("%d\n",*q);return 0;}结果为1010程序4:#include&stdio.h&void fun(int *p){*p=100;}main(){int a=10;int *q;q=&a;printf("%d\n",*q);fun(q);printf("%d\n",*q);return 0;}结果10100为什么?---------------------------------------------------------------1.被分配内存的是行参s,p没有分配内存2.被分配内存的是行参s指向的指针p,所以分配了内存---------------------------------------------------------------不是指针没明白,是函数调用的问题!看看这段:7-4-1指针参数是如何传递内存的?&&&& 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么?void GetMemory(char *p, int num){&&&& p = (char *)malloc(sizeof(char) * num);}void Test(void){&&&& char *str = NULL;&&&& GetMemory(str, 100);&&&&& // str 仍然为 NULL&&&&&&&&&& strcpy(str, "hello");&&&&& // 运行错误}示例7-4-1 试图用指针参数申请动态内存毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把 _p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因 为没有用free释放内存。如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例7-4-2。void GetMemory2(char **p, int num){&&&& *p = (char *)malloc(sizeof(char) * num);}void Test2(void){&&&& char *str = NULL;&&&& GetMemory2(&str, 100);&&&&& // 注意参数是 &str,而不是str&&&& strcpy(str, "hello");&&&&&&&&&& cout&& str &&&&&& free(str);&&&&&}示例7-4-2用指向指针的指针申请动态内存由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,见示例7-4-3。char *GetMemory3(int num){&&&& char *p = (char *)malloc(sizeof(char) * num);&&&&}void Test3(void){&&&& char *str = NULL;&&&& str = GetMemory3(100);&&&&&&&&&& strcpy(str, "hello");&&&& cout&& str &&&&&& free(str);&&&&&&}示例7-4-3 用函数返回值来传递动态内存用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例7-4-4。char *GetString(void){&&&& char p[] = "hello world";&&&&&&&&& // 编译器将提出警告}void Test4(void){char *str = NULL;str = GetString();&&&&& // str 的内容是垃圾cout&& str &&}示例7-4-4 return语句返回指向“栈内存”的指针用调试器逐步跟踪Test4,发现执行str = GetString语句后str不再是NULL指针,但是str的内容不是“hello world”而是垃圾。如果把示例7-4-4改写成示例7-4-5,会怎么样?char *GetString2(void){&&&& char *p = "hello world";&&&&}void Test5(void){&&&& char *str = NULL;&&&& str = GetString2();&&&& cout&& str &&}示例7-4-5 return语句返回常量字符串函数Test5运行虽然不会出错,但是函数GetString2的设计概念却是错误的。因为GetString2内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetString2,它返回的始终是同一个“只读”的内存块。---------------------------------------------------------------看看林锐的《高质量的C/C++编程》,上面讲得很清楚的---------------------------------------------------------------对于1和2:如果传入的是一级指针S的话,那么函数中将使用的是S的拷贝,要改变S的值,只能传入指向S的指针,即二级指针---------------------------------------------------------------程序1:void myMalloc(char *s) //我想在函数中分配内存,再返回{s=(char *) malloc(100); // s是值参, 函数返回后就回复传递前的数值,无法带回分配的结果}这个和调用 void func (int i) {i=1;}; 一样,退出函数体,i指复原的程序2:void myMalloc(char **s){*s=(char *) malloc(100); // 这个是可以的}等价于void int func(int * pI) {*pI=1;}&pI指针不变,指针指向的数据内容是变化的值参本身不变,但是值参指向的内存的内容发生了变化。也许上面的二级指针比较难理解,其实,就是改变的指针指向的地址,那么,我们为何不直接取地址操作呢,对了,用C++中的&void myMalloc(char *&s)//直接取s指向的地址{s=(char *) malloc(100); // 这个是可以的}int main()&{&&& char *lps = NULL;&& myMalloc(lps);if(lps)&& strcpy(lps, "test");else&& cout&&"no memory"&&cout&&lps&&return 0;}程序3:void fun(int *p){int b=100;p=&b;&&&&&& // 等同于第一个问题, b的地址并没有被返回}程序4:void fun(int *p){*p=100; // okay}结论:1.&&&&&& 函数的返回值是指针类型的,检查是静态内存指针还是堆内存指针还是栈内存指针,栈内存指针是绝对要不得滴!2.&&&&&& 函数需要使用指针参数进行传入传出的,在函数中只能对指针的指向的值(*p)进行修改,而不能修改指针指向,也就是指针地址!(函数中不得修改指针参数的地址,否则请使用指针的指针!)
TA的最新馆藏
喜欢该文的人也喜欢欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 4846 人关注过本帖
标题:求一个指针的长度
等 级:新手上路
帖 子:17
&&问题点数:0&&回复次数:22&&&
求一个指针的长度
{char *p=&abcde\Ofghjik\0&;
&printf(&%d\n&,strlen(p));
}这个程序输出的结果是___.参考答案是12
结束标志'\0',此出是字母'O',还是数字'0'?此题在书上前面\后的字符与后面\后的字符是不同的.如果后面一个是结束字符,为什么答案不是13,'\'算不算字符.如果前面那个是结束字符,答案是不是应该是5.请分析一下.
搜索更多相关主题的帖子:
&&&&&&&&&&
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
#include&string.h&
#include&stdio.h&
&&&&char *p=&abcde\Ofghjik\0&;
&&&&printf(&%d\n&,strlen(p));
&&&&while(printf(&%c&,*p)&&*(p++)!='\0');
[[it] 本帖最后由 sunkaidong 于
22:44 编辑 [/it]]
学习需要安静。。海盗要重新来过。。
等 级:新手上路
帖 子:17
求这个程序的运行结果
fun(char *w,int n)&&&/*我的理解:从下面主函数知道n=7*/
{char t,*s1,*s2;
s1=w;s2=w+n-1;&&&/*把字符串&1234567&的首地址赋给s1,把w+6赋予s2.*/
while(s1&s2){t=*s1++;*s1=*s2--;*s2=t;}/*s1与s2比较是不是比首地址处字符的ASCII码?t=*s1++是怎么执行的,是先将s1所指的内容赋予t,再s1指向下一个字符?还是先移向下一个字符,再把此字符赋予t呢?)*/
p=&1234567&;
fun(p,strlen(p));/*我的理解:strlen(p)=7*/
}答案1711717&&请分析一下
等 级:新手上路
帖 子:17
(long*)p是什么意思
求程序输出结果
{char *p=&abcdefgh&,*r;
&q=(long*)p; 不懂?是不是取p的内容强制定义?
r=(char*)q; 不懂?
printf(&%s\n&,r);
} 答案efgh 分析一下
等 级:新手上路
帖 子:17
(long*)p是什么意思
求程序输出结果
{char *p=&abcdefgh&,*r;
&q=(long*)p; 不懂?是不是取p的内容强制定义?
r=(char*)q; 不懂?
printf(&%s\n&,r);
} 答案efgh 分析一下
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
t=*s1++;*s1=*s2--;*s2=t这里有问题...你做完之后指针下移了..你的程序我没办法执行
学习需要安静。。海盗要重新来过。。
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
#include&string.h&
#include&stdio.h&
void fun(char *w,int n)&&&
&&&&char t,*s1,*s2;
&&&&s2=w+n-1;&&
&&&&while(s1&s2)
&&&&&&&& t=*s1;
&&&&&&&& *s1=*s2;
&&&&&&& *s2=t;
&&&&&&&&s1=s1+1;
&&&&&&&&s2=s2-1;
&&&&&&&&};
&void main()
&&&& char p[]=&1234567&;
&&&&fun(p,strlen(p));/*我的理解:strlen(p)=7*/
&&&&puts(p);
不要用指针了..还是用数组吧...
学习需要安静。。海盗要重新来过。。
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
(long*)p是什么意思
求程序输出结果
{char *p=&abcdefgh&,*r;
q=(long*)p; //把它转化为long指针
q++;//以long的方式下移四个字节
r=(char*)q; //在转化回来
printf(&%s\n&,r);//字符串..到结尾结束
} 答案efgh 分析一下
学习需要安静。。海盗要重新来过。。
来 自:浙江大学
等 级:论坛游民
帖 子:279
专家分:11
[bo]以下是引用 [un]simplelive[/un] 在
22:36 的发言:[/bo]
{char *p=&abcde\Ofghjik\0&;
&printf(&%d\n&,strlen(p));
}这个程序输出的结果是___.参考答案是12
结束标志'\0',此出是字母'O',还是数字'0'?此题在书上前面\后的字符与后面\后的字符是不同的.如果后面一个是 ...
我还是没有敢想当然,实际的运行了一下,发现输出结果是strlen(p)=5.也就是说\0中的\被当作转义的意思,因此这里的\0代表的是“null”,也就是值0。
来 自:浙江大学
等 级:论坛游民
帖 子:279
专家分:11
[bo]以下是引用 [un]sunkaidong[/un] 在
23:22 的发言:[/bo]
(long*)p是什么意思
求程序输出结果
{char *p=&abcdefgh&,*r;
q=(long*)p; //把它转化为long指针
q++;//以long的方式下移四个字节
r=(char*)q; //在转化回来
printf(&%s\n&,r);//字符串..到结尾结束 ...
因为sizeof(long)=4,所以q++相当于q移动了4个字节,而sizeof(char)=1。因此指针移动到了第5个字符e的位置。所以打印出来的就是efgh了。如果你把上面的指针类型从long*改为int*,那么在16位下,int是2字节的,将会打印出来的就是“cdefgh”了。
[[it] 本帖最后由 hoodlum1980 于
23:30 编辑 [/it]]
版权所有,并保留所有权利。
Powered by , Processed in 0.196131 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved

我要回帖

更多关于 易语言 指针到对象 的文章

 

随机推荐