序言:
最近对C比较感兴趣(以前一直用JAVA),发现很多JAVA的特性,底层都是用的C思想实现的(比如String),打算把近期学习的整理成一个系列,因边学边写,有不妥的地方,欢迎各位看官一起讨论。
由于JAVA基本语法(数据类型、循环控制、函数(方法声明)都类似,所以不罗列这部分内容,主要讲解C与JAVA的不同点。中间会穿插一此JAVA的场景,并与此做对比。
本章介绍指针。
先看一个字符指针的例子。这个例子测试的目地是打印指针P的地址,指针P地址里面的内容,以及指针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重新指向另一个字符串。
[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所指向的地址一样。
[img]http://dl2.iteye.com/upload/attachment/0105/3471/ce9fdd48-8db2-3ec4-baed-46c592e2d559.png[/img]
接着测试:
这里会报错误,因为企图往一个指针地址赋值abc,即*p的值0x7fff65485a00修改为abc
正确的写法为p = "abc";
再看下面这个例子。
这也会报错,因为q表示一个字符串常量,声明以后不允许修改。正确的赋值是使用 strcpy(q,"abc");这类似java中声明一个字符串:String q = "abc"; q的值是不允许修改,我们在做+操作时,只不过是编译时会产生另一个新的字符串,内部使用到了stringbuilder
最近对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