数组与指针<一>l
**********************************************************
常量与指针:
const int* p; //p可变,p指向的内容不可变
int const* p; //p可变,p指向的内容不可变
int* const p; //p不可变,p指向的内容可变
const int* const p; //p和p指向的内容都不可变
当const出现在*号左边时指针指向的数据为常量
当const出现在*后右边时指针本身为常量
**********************************************************
数组地址与数组名:
数组名代表数组首元素的地址
数组的地址需要用取地址符&才能得到
数组首元素的地址值与数组的地址值相同
数组首元素的地址与数组的地址是两个不同的概念
**********************************************************
数组名的盲点:
数组名可以看做一个常量指针
数组名“指向”的是内存中数组首元素的起始位置
在表达式中数组名只能作为右值使用
只有在下列场合中数组名不能看做常理指针
* 数组名作为sizeof操作符的参数
* 数组名作为&运算符的参数
**********************************************************
指针和数组的处理方式:
处理指针需要经过一次寻址操作
处理数组无寻址
1 #include <stdio.h> 2 /** 3 ** another.c 4 ** char* p = "hello world"; 5 **/ 6 7 extern char p[]; 8 9 int main() 10 { 11 printf("%s\n", p); 12 13 return 0; 14 }
这个函数打印的应该是乱码,为什么呢?这就是数组和指针的处理方式的不同了。
根据处理数组的方式更改代码:
1 #include <stdio.h> 2 /** 3 ** another.c 4 ** char* p = "hello world"; 5 **/ 6 7 extern char p[]; 8 9 int main() 10 { 11 printf("%s\n", (char *)(*((unsigned int*)p))); 12 13 return 0; 14}
用指针的处理方式:
1 #include <stdio.h> 2 /** 3 ** another.c 4 ** char* p = "hello world"; 5 **/ 6 7 extern char* p; 8 9 int main() 10 { 11 printf("%s\n", p); 12 13 return 0; 14 }
好吧,先写到这,后续。