版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010672206/article/details/9032017
请仔细看下面的程序,比较运行所得到的结果,仔细分析 出现的问题!
#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