1:指针常量
*100=25 (假设100是a的地址,如果你想把a的值改成25,使用*100=25是否可以?)
答案:这样做是错误的,字面值100的类型是整形,而解引用操纵只能对指针类型进行操作,所有应该成 *(int *100)=25;
2:指针变量p
a:指针变量p里面存储的任何数据都被当作地址处理。
b:指针变量的大小和*前面的数据类型无关。
c:*前面的数据类型只能说明指针指向变量的数据类型。
d:声明不需要分配空间,而定义需要,所以:
int a[100];和int a[];作为声明没有什么区别
f:定义为指针,声明为数组:
add.c
<pre name="code" class="html"><span style="color:#330000;">char *a="abcdef";</span>
test.c
#include <stdio.h>
extern char a[];
extern print();
int main()
{
print();
printf( "%p\n", a);
printf( "%s\n", a);
printf( "%s\n", *(char **)a);
printf( "%s\n", (char *)*(int *)a);
return 0;
}
3:数组指针和指针数组
int *p1[10] //数组指针
数组指针:*p1[10];
根据运算符优先级的关系,下标运算符的优先级高于*运算符,所以数组名p1先和【10】结合,表示数组的大小为10个元素的大小,随后p1[10]在于int *结合,表示数组中元素的类型为指向整形的指针类型。
指针数组:int (*p2)[10];
理解:表示的是一个能指向10个整型元素的数组的指针,注意是指针,而不是数组。
那怎样对指针数组进行引用呢:
int arr[10];
int (*parr)[10]=&arr;
下来我们来看这样两行代码:
int *arr[10]; // 数组指针
int(*parr)[10]=arr; //指向数组的指针
我们想通过数组指针对指向数组的指针进行引用,于是传递给指针数组一个数组名arr,但编译器发出以下警告:
warning C4047: “初始化”:“int (*)[10]”与“int **”的间接级别不同
原因是:arr是指针数组arr[10]的首地址,而arr[10]中元素的类型都是int *类型,所以arr的类型就为int **,所以编译器发出了警告。
如要正确引用:需把整个数组的地址传递给指针数组,而不是首地址,并且要把指针数组的类型强制转化为(int *)类型,因为数组指针arr中,元素的类型为int *型。
总结:初学小白,如有描述不当之处欢迎指出!!!