逐步记录一下指针学习过程中的知识点,以备后续复习使用
1.假设 p 是指向数组 arr 中第 n 个元素的指针,那么 *p++、*++p、(*p)++ 分别是什么意思呢?
*p++ 等价于 *(p++),表示先取得第 n 个元素的值,再将 p 指向下一个元素
*++p 等价于 *(++p),会先进行 ++p 运算,使得 p 的值增加,指向下一个元素,整体上相当于 *(p+1),所以会获得第 n+1 个数组元素的值。
(*p)++ 就非常简单了,会先取得第 n 个元素的值,再对该元素的值加 1。假设 p 指向第 0 个元素,并且第 0 个元素的值为 99,执行完该语句后,第 0 个元素的值就会变为 100。
2.字符串指针
1) 字符串的两种表示方式
char str[]="http://c.biancheng.net";
或者 char*str="http://c.biancheng.net";
两种方式都可以采用%s
输出整个字符串,都可以使用*
或[ ]
获取单个字符
区别:字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,
而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
如何选择?在编程过程中如果只涉及到对字符串的读取,那么字符数组和字符串常量都能够满足要求;如果有写入(修改)操作,那么只能使用字符数组,
不能使用字符串常量。
1
2
3
4
5
|
int
main(){
int
a[4]={1,2,3,4};
int
*ptr=(
int
*)(&a+1);
printf
(
"%d"
,*(ptr-1));
}
|
答案为4
解答:
C 语言中,对1个指针加一的结果是对该指针移动到下一个存储着相同数据元素类型元素的单元。
括号中的(&a+1),其实际指针类型为 int(*)[4] ,指针指向的类型为 int()[4] ,
所以对 &a 指针加一的结果是移动到下一个 int()[4] 的单元,即当前数组尾的下一个单元。
在进行了指针类型转换后,指针类型变为int *,指针指向类型变为 int,此时ptr-1的结果就是把指针向前移动一个int类型的大小,正好指向数组最后一个元素