跟我一起学习C(指针篇1)

序言:

最近对C比较感兴趣(以前一直用JAVA),发现很多JAVA的特性,底层都是用的C思想实现的(比如String),打算把近期学习的整理成一个系列,因边学边写,有不妥的地方,欢迎各位看官一起讨论。

由于JAVA基本语法(数据类型、循环控制、函数(方法声明)都类似,所以不罗列这部分内容,主要讲解C与JAVA的不同点。中间会穿插一此JAVA的场景,并与此做对比。

本章介绍指针。
先看一个字符指针的例子。这个例子测试的目地是打印指针P的地址,指针P地址里面的内容,以及指针P所指向的内容。


char *p = "hello world!";
//打印指针P地址
printf("%p\n",&p);
//打印P所指向的值
printf("%s\n",p);
//打印P本身地址所存储的值,即hello world!的地址
printf("%p\n",*p);


[img]http://dl2.iteye.com/upload/attachment/0105/3467/779d9bf5-7845-3e8e-ae04-9f8bb2ac30ce.png[/img]



指针本质就是一个变量(4字节),它也有地址,也会存储内容。所存储内容即为 “=” 右边的起始地址值,使用*p取值(注意与声明指针变量的差别)。如下图。

[img]http://dl2.iteye.com/upload/attachment/0105/3465/b02ca615-566e-3bfd-8b5d-e5d2e535a4d3.png[/img]



修改一下,让p重新指向另一个字符串。

char *p = "hello world!";
printf("%p\n",&p);
printf("%s\n",p);
printf("%p\n",*p);

p = "c and c++";
printf("%p\n",&p);


[img]http://dl2.iteye.com/upload/attachment/0105/3469/35cac99a-0b30-343a-b647-9da1d847a561.png[/img]

观察&p的值和前面的一样。证明p声明以后,其地址不会改变,改变的只是P的内容,即*p

重新声明一个变量q,其也指向hello world!。打印*q的值,发现与*p值相同。是不是与java中的一样,在java中 String a = "abc"; String b = "abc";运行时存放在字符串常量池(永久带)中,a,b所指向的地址一样。


char *q = "hello world!";
printf("%p\n",*q);


[img]http://dl2.iteye.com/upload/attachment/0105/3471/ce9fdd48-8db2-3ec4-baed-46c592e2d559.png[/img]


接着测试:


strcpy(p,"abc");


这里会报错误,因为企图往一个指针地址赋值abc,即*p的值0x7fff65485a00修改为abc

正确的写法为p = "abc";

再看下面这个例子。

char q[] = "hello C";
q = "abc";


这也会报错,因为q表示一个字符串常量,声明以后不允许修改。正确的赋值是使用 strcpy(q,"abc");这类似java中声明一个字符串:String q = "abc"; q的值是不允许修改,我们在做+操作时,只不过是编译时会产生另一个新的字符串,内部使用到了stringbuilder
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值