常量指针运用, 指针和数组名的赋值,以及各自的内存空间问题 浅谈 !
来源:互联网 发布: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
#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
#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
- 常量指针运用, 指针和数组名的赋值,以及各自的内存空间问题 浅谈 !
- 数组名表示指针常量的问题
- 二十八、数组、指针和字符串:指针的赋值和指针运算(指针常量,常量指针)
- 对空指针赋值的问题 指针的指针 指针的指针和指针数组
- 指针和数组的区别 内存空间
- 关于二维数组名和指针的指针的问题
- linux c 中关于指针常量和常量指针以及数组的关系与区别
- 常量指针、指针常量以及指向常量的指针常量
- 数组指针和指针数组以及指针的指针
- 数组、指针和字符串:指针的赋值和指针运算
- 指针常量和常量指针以及指向常量的常量指针
- 对指针赋值,指针一定要有一定的内存空间!
- 【C++】由指针常量和常量指针引发的问题
- char数组和指针与CString之间的赋值问题
- 关于二维数组地址和指针之间赋值的问题
- 指针和数组函数的关联和各自的区别
- 指针的几种形式(常量指针和指针常量,指针数组和数组指针,指针函数和函数指针,数组和指针)
- 关于未指针数组赋值的问题
- 排序算法系列之堆排序
- Java集合框架-Set(TreeSet)
- BusyBox1.21.0编译流程
- 图片上传预览 兼容ie67 8 9 及 FF
- Java编程思想--正则表达式
- 常量指针运用, 指针和数组名的赋值,以及各自的内存空间问题 浅谈 !
- opencv
- JavaScript中对象的创建
- 实现的Date格式化- js格式化Date& java格式化
- AspNetPager常见美丽的样式
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- Linux常用命令小结
- 更换64位ubuntu12.04后一些软件的配置问题
- 图片上传预览 兼容 IE 6 7 8 9 FF chrome opera等版本