C/C++的指针初始化的疑问

来源:百度知道 编辑:UC知道 时间:2024/06/20 23:49:52
举例说明疑问
如int *p中,p才是变量吧!?那p才是储存的地址,*p是指p地址的那个变量,
那么对*p 初始化的时候就应该是
int *p=1;
char *q='a';
等等 才对的啊!
但实际上好象是如
int a[5],,b;
int *p=a;
int *q=&b;
怎么是把一个地址赋给*p,*q呢?
还有 定义一个指针要确定它指向数据的类型 比如 int *P ;p指向的数据类型只能是int型;
那是为什么呢?
指针只存放一个地址而已,难道不同数据类型的地址长度什么的都不一样吗?
以下是我用win-tc实验的程序
int a;
char *p;
a=4;/*输出的值是否相等取决于此处的赋值范围*/
p=&a;
printf("%d\n",a);
printf("%d\n",*p);
如果a在-128~128间输出都是相等的
超出范围后就不一样了.
///////////////////////////////////////////////////////////////////////////////////////////


问题补充:还有 定义一个指针要确定它指向数据的类型 比如 int *P ;p指向的数据类型只能是int型;
那是为什么呢?
因为程序运行执行某种操作的时候需要知道指针的类型
比如 int a[10];
int *p = a;
现在p指向数组的首地址 假设这个地址是0x00000000
那么*p = a[0]
那么怎么指向a[1]呢?执行p = p+1后 *p=a[1]了
请注意 p=p+1不是 0x00000000+1而是0x00000000+4(在32位的机器上)
为什么是加4而不是加1 因为int型在32位机器上是占四个字节
所以指向下一个数组元素的地址就需要把地址移动四个字节
这就是指针需要类型的原因 如果指针是 char类型 那么p=p+1地址就移动一个字节 我的表达能力不太好 不知道你能不能明白

int a;
char *p;
a=4;/*输出的值是否相等取决于此处的赋值范围*/
p=&a;
printf("%d\n",a);
printf("%d\n",*p);
如果a在-128~128间输出都是相等的
超出范围后就不一样了.
这个就像我上面说的 如果是char型 那么printf函数从指针开始读取1个字节输出,如果是int型 那么printf函数从指针开始读取四个字节
a = 4 在内存中存储的为 0x04 0x00 0x00 0x00 (intel的CPU应该是这样存储的 不同的cpu是不一样的好像 地址依次增加)
所以当当a在-128~128时 printf("%d\n",a); printf("%d\n",*p); 都输出0x04 (从指针开始读取一个字节和4个字节是一样的)
如果a大于128 比如在内存中存储的为 0x04 0xFF 0x00 0x00
这样printf("%d\n",*p); 就只读取