黑马程序员技术交流社区

标题: c语言指针的困惑,头大 [打印本页]

作者: 四季列车    时间: 2014-3-19 23:08
标题: c语言指针的困惑,头大
#include <STDIO.H>
#include <IOSTREAM>
#define  TRUE 1;
#define FALSE 0;
#define  OK 1;
#define ERROR 0;
#define INFEASIBLE -1;
#define  OVERFLOW -2;
#define LIST_INIT_SIZE 100
#define LISTCREMENT 10
typedef int ElemType;
typedef int Status;
typedef struct{
        ElemType *elem;
        int length;
        int listsize;
}SqList;

Status InitList_Sq(SqList &L){
        L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
        //if(!L.elem) exit(OVERFLOW);
     L.length=0;
         L.listsize=LIST_INIT_SIZE;
        return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e){
        ElemType* newbase;
        ElemType* p;
        ElemType* q;
        if(i<1||i>L.length+1)return ERROR;
        if(L.length>L.listsize){
                newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTCREMENT)*sizeof(ElemType));
                L.elem=newbase;
                L.listsize+=LISTCREMENT;
        }
  q=&(L.elem[i-1]);
  for (p=&(L.elem[L.length-1]);p>=q; --p) *(p+1) = *p;
  *q=e;
  ++L.length;
return OK;
}

int main(){
       
        return 0;
}
上面代码里,有ElemType *elem;其中ElemType 是一个int ,为什么我看见书本上写成elemt[1],elemt[2],可是elem明明就是一个int*数据类型,不是一个数组,为什么可以用下标


作者: yaozeyang_2014    时间: 2014-3-20 14:22
楼主是不明白int *array和int array[]的区别吧!其实他们的关系是很密切的。int* array中的array是这个数组的首地址,等价于int array[]中的array,只是前者是一个常量,后面的那个不是,如果是字符串的话,前者一旦赋值后不能更改,相当于const,后者复制后可以在字符串里面修改某个指定的元素。
  1. char *array = "hello";
  2. char array1[] = "hello";
  3. array1[2] = 'r';
  4. array[2] = 'r';      //这个是错误的
复制代码

作者: 四季列车    时间: 2014-3-20 16:55
你太有才了
作者: conpgy    时间: 2014-3-20 17:58
其实数组名就是代表存储了数组第一个元素的地址。比如:int array[3] = {1, 2, 3};,array就是表示第一个元素1的地址。所以如果定义一个指针变量p,如:int *p;这里p也是存储一个地址。该地址指向一个整型的数据。所以可以p = array,就是表示将数组的首地址赋值给p。说白了,array[1]就等于*(p+1)。array[2]就表示*(p+2)。他们在外表上不同。其实经过编译器转换后是一样的。所以如果用p[1],和*(p+1)是完全等价的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2