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

本文深入探讨了C++中指针的基本概念及使用方法,包括指针的初始化、赋值、以及通过指针操作结构体成员等问题。特别强调了指针使用时需要注意的细节,如必须先分配内存再进行赋值等关键实践。

 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; 
这样的语句才有意义。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值