数组名和指针详解

##############################################################################
#首先对指针和数组名的得出如下结论:
##############################################################################
1.指针:只有指针可以保存地址,指针也只能用来保存地址
2.数组名:①数组名的内涵在于其指代实体是一种数据结够,这种数据结构就是数组
              ②数组名的外延在于其可以转换为指向其指代结构的指针,而且是一个指针常量
          ③指向数组的指针则是另外一钟变量类型,仅仅意味着占据存放的地址
3.&和*在数组和指针中的运算
    ①一维数组和指针在“*”运算都有访存操作
    ②多维数组在“*”运算只是类型改变,没有具体操作
    ③指针变量在“*”运算先访问内存,获得地址,再取地址对应内存中的值
    ④指针变量在“&”运算时,得到指针变量的地址
    ⑤数组在“&”运算时,只是类型改变,没有具体操作
4.对数组进行sizeof运算时,结果是整个数组占用内存空间的大小;而sizeof(指针)得到的值是编译器分配给指针的内存空间
##############################################################################
#通过实例看上面结论
##############################################################################

  1 #include <iostream>
  2
  3 using namespace std;
  4
  5 void printf(int temp[])
  6 {
  7         cout << "sizeof(temp):" << sizeof(temp) << endl;
  8
  9         cout << "*(temp++):" << * (temp++) << endl;
 10         cout << "*(temp):" << * temp << endl;
 11 }
 12
 13 int main()
 14 {
 15         int num[10]={10,2,3,4,5,6};
 16         int * p = num;
 17
 18         cout << "sizeof(num):" << sizeof(num) << endl;;
 19         cout << "sizeof(p):" << sizeof(p) << endl;
 20
 21         printf(num);
 22 }

//运行结果:
sizeof(num):40
sizeof(p):4
sizeof(temp):4
*(temp++):10
*(temp):2


说明:
    ①程序中第18行,说明数组名指代一种数据结构:数组
    ②程序中第16行,说明数组名可以作为指针常量,不能将数组名放在“=”走边
    ③程序中第7、9、10行,说明数组名作为形参时,在函数体内,失去了本身的内涵,即不能指代一种数据结够,仅仅是一个指针而已;可以对其进行自增、自减等操作(注意:如果自增或者自减超出数组的大小的范围,将会是一个乱值)

##############################################################################
#区分三类指针
##############################################################################
1.指向常量的指针:是指一个指向常量的指针变量。不可以修改这个指针所指向的变量,但是可以将这个指针指向另外一个常量,例如
    const char * name = "zhang";
    name[3] = "t";//错误,禁止通过name去修改它所指向的数据
    name="hello";/正确

2.常指针:将指针本身,不是将指针所指向的变量声明为常量。
    例如:
    char * const name="hello";
    name[3] = "t";//正确
    name = "nihao";//错误

3.指向常量的常指针:这个指针不能变,这个指针所指向的变量也不能变。
例如:
    const char * const name = "zhang";
    name[3] = "t";//错误
    name = "hello";//错误

参考:http://www.360doc.com/content/10/0530/16/1506547_30328230.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值