Fork me on GitHub

指针地址偏移问题*(p+3)+=2;及指针赋初值

 static int a[6]={1,2,3,4,5,6};

    int *p=a;

    *(p+3)+=2;//*(p+3)为第四个元素的地址,自加2,偏移两位指向6;

    printf("%d,%d,%d",*p,*(p+3),*(p+5));

1,6,6

 

 int *p;

    *p=10;

    printf("%d",*p);

会报错;指针没分配地址不能赋值;改成:

 int *p;

p=malloc(sizeof(int));

*p=10;

 printf("%d",*p);

就对了;



指针赋初始值,提问:

//头文件
typedef struct _MyData {
 SOCKET sConn;
 int ConnNum;
} MYDATA, *PMYDATA;

……

protected:
 PMYDATA pData;

//CPP文件
构造函数初始化
pData=NULL;

void CView::OnBnClickedBtnStart()
……
 SOCKET m_sock;
 int n;
……
//m_sock,n 被赋值(略)。
//pData一直显示0x00000000 {sConn=??? ConnNum=??? }_MyData *
//ConnNum:CXX0030: 错误: 无法计算表达式的值
//sConn:CXX0030: 错误: 无法计算表达式的值
 pData->ConnNum=n;
 pData->sConn=m_sock;
//上面的赋值出错!
//xxx.exe 中的 0x00414d3c 处未处理的异常: 0xC0000005: 写入位置 0x00000004 时发生访问冲突


我的pData分明已经初始化了啊!


解答:

PMYDATA pData;
这句只声明了一个PMYDATA类型的指针pData,
执行语句
pData = new MYDATA;
才真正在内存中分配一块用来存储MYDATA类型的空间,并使pData指向所分配空间的首地址,
之后,
pData->ConnNum=n;
pData->sConn=m_sock; 
这样的语句才有意义。


posted on 2012-02-21 19:42  pengyingh  阅读(3463)  评论(0)    收藏  举报

导航