对指针仍有不理解,能否请大神再指导下,先谢谢啊
我对于指针的理解是:
假设有指针P1,那么
P1
--------
123 456
如上123是P1自己的存放地址,456是P1指向的地址
这样对吗?
但是问题来了,如下
char const* ppp="12345";
这里ppp是一个指针?,好吧
ppp自身肯定存在于某个地址,假设是789,这个没错
那么如上申明,就表示自789开始的那个地址空间总共6个字节保存了"12345\0" 呢?
或者说这里的char const* ppp 这个变量保存的不是地址,是一个字符串。
所以char const* 是一种特殊的指针,它并没有指向别的地址?
[解决办法]
int a;
.....
int* p1=&a;
p1是一个内存单元,这个单元的值是变量a的地址,至于p1本身的地址未知
如果想获得p1本身的地址,则使用
int** p2=&p1;获得,p2也是一个内存单元,也就是所谓的指针的指针
[解决办法]
比如0xff38 这个地址存放变量a的值456
int* p=&a
p==0xff38
*p==456
p自己的存放地址为&p.
char const* ppp 和
char* const ppp 是不同的,一个指向的内容是个常量,一个指针不能改变(不能指向其它),看const后面,是*ppp为const还是ppp为const。
以上我的理解,没有常用C语言写程序,具体翻书为准。
[解决办法]
你可以写个小程序还printf各个a,&a,p,&p,sizeof(a),sizeof(p)
[解决办法]
就表示自789开始的那个地址空间总共6个字节保存了"12345\0" 呢?
这句话错了!
789是指针本身的地址,但是只能说指针指向"12345\0"这个字符串的首地址!
或者说789这地址值上的内存空间上存放着"12345\0"这个字符串!
789这个地址值和"12345\0"这个没有关系的!只是指针可以通过789这个地址值找到"12345\0"这个字符串的!
[解决办法]
char const* ppp="12345" ; //这句话的意思是把"12345"这个字符串的首地址赋值给了ppp这个指针,也就是说ppp它指向地址是"12345"这个字符串,
789是ppp本身的地址,也就说789这个地址的内存空间存放的内容是"12345"这个字符串的首地址!
[解决办法]
char const* ppp="12345";
这里ppp是一个指针?,好吧
ppp自身肯定存在于某个地址,假设是789,这个没错
那么如上申明,就表示自789开始的那个地址空间总共6个字节保存了"12345\0" 呢?
常量字符串存储在常量区。一般的变量存储在栈上,而你自己分配内存的存在堆上
[解决办法]
const char *pBuf = NULL;
00B83EB0 mov dword ptr [ebp-18h],0 //pBuf是一个栈变量, 其存放地址是 epb-18h
// []即相当于对地址epb-18h去引用.
pBuf = "abcdefg";
00B83EB7 mov dword ptr [ebp-18h],0C38124h //0C38124h即存放串"abcdefg"的地址.
//把这个地址给了指针pBuf
如果楼主能理解这两句汇编代码, 那这个指针的问题也就理解了.
[解决办法]
char const* ppp="12345";
这种情况,比较特殊,可以看作
staic char const pconst [] ="12345";
char const *ppp =pconst ;简化写法。
即同时定义了,一个匿名的全局字符常变量数组,和一个有名字的常量字符指针。
指针的值,是数组的首地址。
pconst 由于没有名字,所以不可直接访问,只有通过ppp才能访问。
[解决办法]
我对于指针的理解是:
假设有指针P1,那么
P1
--------
123 456
如上123是P1自己的存放地址,456是P1指向的地址
这样对吗?
但是问题来了,如下
char const* ppp="12345";
这里ppp是一个指针?,好吧
ppp自身肯定存在于某个地址,假设是789,这个没错
那么如上申明,就表示自789开始的那个地址空间总共6个字节保存了"12345\0" 呢?
或者说这里的char const* ppp 这个变量保存的不是地址,是一个字符串。
所以char const* 是一种特殊的指针,它并没有指向别的地址?
ppp是一个指针,占4个字节(指针的大小).假设起始地址是789.那么789,790,791,792这四个字节会存放着一些内容.假设是0x12345678.那么0x12345678这个地址开始,存放着“12345”
[解决办法]
ppp是一个指针,占4个字节(指针的大小).假设起始地址是789.那么789,790,791,792这四个字节会存放着一些内容.假设是0x12345678.那么0x12345678这个地址开始,存放着“12345”
我觉得#13同sdu20112013理解有问题啊,32位系统中指针的大小通过sizeof(ppp)可知为4,就是4字节(4BYTE刚好是2的32次方bit),那么这4字节代表什么呢,代表的是ppp自身地址,比如说16进制的0X1234,这个地址位置在内存的栈区,其存储的内容789,是字符串常量“12345”的首地址,而789这个地址位置在内存的文字常量区,其存储的内容为字符串“12345”的第一位,那么790就指字符串的第二位,依此类推。
你看看LZ的描述。他的意思就是说假设789是指针本身的地址