常量指针运用, 指针和数组名的赋值,以及各自的内存空间问题 浅谈 !

来源:互联网 发布:linux jdk 中没有jre 编辑:程序博客网 时间:2024/05/14 07:16
请仔细看下面的程序,比较运行所得到的结果,仔细分析 出现的问题! 


#include<iostream>
using namespace std;
int main()
{
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    int *p; 
     p = (int *)a ; //强制类型转换 否则的话 直接这样 p= a操作的话会提示  `int[3][3]' to `int*' in assignment  的错误!
     //assignment   转化  转让  委派委任! 
     cout<<sizeof(p)<<endl;//不管 p 是何种类型的 但是只要用sizeof()去测指针变量的空间内存大小的时候,都是4 ; 
     cout<<sizeof(a)<<endl; ///整形术组 的空间的大小! 
     cout<<sizeof(a[0])<<endl;//二维数组第一列所占的空间大小! 
     cout<<*(a[0] + 2)<<endl;//通过指针的偏移寻找二维数组的第一行的 相关元素! 
     system("pause");
     return 0;
     }
 运行的结果 : 
 4
36
12
3




#include<iostream>
using namespace std;
int main()
{
int a[3]= {1,2,3};
    int *p; 
     p = a ; 
     cout<<sizeof(p)<<endl;
     cout<<sizeof(a)<<endl; 
     cout<<sizeof(a[0])<<endl;
     cout<<*(a + 2)<<endl;
     system("pause");
     return 0;
     }
运行的结果 :
4
12
4
3

仔细观察上面的两段程序,最重要的 知识点当然是 二维数组的数组名,行地址,列地址等的知识;还有就是 数组名给指针赋值的问题,要同类型的转化

否则就会出错了!  看上面就通过 强制类型的转化才能实现! 所以不要出现像把 int [][] 型赋给 int*等类型不一致的情况!自己要深刻理解!体会!

对于指针的所代表的内存多少,还有下面这种情况: 
#include<iostream>
using namespace std;
int main()
{
char *p = "nyistweb",*u;  //常量字符串 可以对使用 下标的方式,对每一个元素进行输出! 但是不能用赋值的语句对字符串中的元素进行修改! 
//这是c 中唯一的特殊的常量 指针 不是变量!  注意注意!!!!!!!!!  当然常量 指针 p 记录的仍是这串字符串的首地址只是 不能在改变
//常量字符串的内容了! 可以对其重新的赋值 但是当为常量字符串的时候就不能在改变其内容了!
/*上面的语句相当于 char *p;

p="nyistweb";  只要是这种两种形式的都为常量字符串! 常量 指针 p 记录的仍是这串字符串的首地址 而不要理解为 把字符串的内容存放到 p中*/ 
char v[10000]="ahsfhjgfsajkh";
cout<<p<<endl; //这样输出的结果为:" nyistweb" ,
//(*p)='m';  所以这里就不可以这样赋值! 
p=v; //这里就不是常量字符串了,可以改变了! 
u=v;
(*p)='n'; // 而这里就可以这样赋值 
cout<<p<<endl;//同样这里输出的是字符串而不是 一个地址 
cout<<strlen(p)<<endl; //这里的结果是8 ,前面说了不管 p 是何种类型的 但是只要用sizeof()去测指针变量的空间内存大小的时候,都是4  
//这里并不冲突,为什么是8 因为这里用的是 strlen 而不是 sizeof 而strlen 是专门用来测试 字符串的元素个数的函数(在c++ string 类型的字符串用的是
//length())所以 测的答案是 字符串元素的个数为 8 当用 sizeof测试时任然  为4  并不是像想的那样测的是 字符串所占的空间大小,因为这是指针,不是
//一般的数组名, 指针记录的是 此字符串的首地址,所以数组的名和指针的实质还是有区别的!
 
system("pause");
     return 0;
 }
 运行的结果: 
8

原创粉丝点击