指针总结(—)

来源:互联网 发布:大众软件电子版 pdf 编辑:程序博客网 时间:2024/06/05 17:12
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];  // 指向数组的指针
指针数组: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 *型。


总结:初学小白,如有描述不当之处欢迎指出!!!

2 0
原创粉丝点击