
这个是指针 p,指针就是一个地址,p表示地址里的内容,所以如果想要给变量var赋值,只要用 var = p就可以了
因为你申请的是char型的数组,所以你输入的内容都将被认为只有一个字符,而且是字符型的,如果用int型就不会出现这个问题了,char型最大只能表示0~255,不可能放下你的数
指针类型是动态的,通过指针地址,可以以任意类型方式取值。
程序中,动态获取指针数据类型,应该说没有实际意义。在确认指针安全的情况下,可以通过模板函数的重载,来实现动态获取指针类型。
其实就是建立若干个同名而参数类型不同函数,返回指定的值:
int DataType(int){return 4;}
int DataType(char){return 1;}
int DataType(double){return 3;}
调用的时候,
int dType = DataType(p);
即可。
HMODULE hDll = LoadLibrary(TEXT("DllExportsExdll")); // 加载一个DLL
FARPROC pfn = GetProcAddress(hDll, "Func"); /// 获取函数地址,第一个参数为DLL模块句柄,第二个参数为函数名称
#include<iostream>
using namespace std;
class base
{
private:
int id;
char name;
public: //下面的成员函数不应该私有,应该公有,才能在main里使用
int getId()
{return id;}
char getName() //char getName()改为char getName()
{return name;} //return name;改为return name;
void setId(int id)
{this->id=id;}
void setName(char name)
{this->name=name;}
}; //类的最后挂号后面应该加分号,不能丢,切记
int main(int argc, char argv[])
{
base b;
char p="xxxxx";
bsetName(p);
cout<<bgetName()<<endl;
return 0;
}
另外再补充点,不知道对楼主有没有用,希望对你有帮助。
上面程序的改写:
#include<iostream>
#include<string> //string头文件
using namespace std;
class base
{
private: //把私有成员与下面成员函数里的参数区分,可以不利用指针,更方便
int ID; ////
string Name; //利用string类型,加头文件#include<string>
public:
int GetID()
{return ID;} ////
string GetName()
{return Name;} ////
void SetID(int id)
{ID=id;} //私有成员和函数参数区分,这样就可以不用到指针
void SetName(string name)
{Name=name;} //私有成员和函数参数区分,这样就可以不用到指针
};
int main(int argc, char argv[])
{
base b;
string p="xxxxx";
bSetName(p);
cout<<bGetName()<<endl;
return 0;
}
你问的这个话题太大。关于指针和引用要讲的东西很多。
我的理解:
指针: 其实指针这个概念在谭浩强的这本书上是这样说的,指针就是地址,指针值就是地址值。指针变量就是存放指针的
变量,所以一定不要将指针与指针变量搞混淆了。指针仅仅是一个地址值,而指针变量就是存放指针(也就是地址的变量)
指针的定义:
例如整型指针: int p;p是一个指向int类型数据的指针变量。里面存放的地址(也就是指针)是一个int类型变量的地址。指针变量时
有类型的,例如p的类型就是int 表示p是一个指向int类型的指针变量。如何知道一个指针变量的类型呢,最简单的方法就是去掉变
量定义语句中的变量名,剩下的部分就是其类型,这种方法适用于所有的变量定义,例如int a;a的类型是int 。 int b[10];b的类
型是int[]表示是一个数组(关于数组类型这里不谈,因为这个问题很微妙,其实在c、c++中没有数组类型这个概念,包括函数类型也
是一样的),int c;c的类型是int 。int d;d的类型就是int ;所以通过这种方法来判断一个变量的类型是很方便的。
说道指针变量,我们必须说到得有几个方面。
1指针类型。
这个很重要,一个指针是有类型的,也就是一个地址是有类型的。具体说是某一个地址会指向不同类型的数据,这是不一样的,例如
int p;p是指向int型数据。 doublep1;p1是指向double型数据。但是p和p1本身在内存中占用的空间是4个字节(对于32位的系统来说
),如果是在TC中编译c程序,应该是2个字节了(dos *** 作系统是16位的)。有人说地址不就是一个值吗,类似于0xfffdddcc这样的地址
数值,为什么还分什么类型呢,我要说的是这个关系很大。我们知道指针是有运算的,int p=&a;那么p++到底加了多少呢,不要以为
是将p里面的地址值加了1,这是完全想当然。实际上加了sizeof(int)这么多个字节。也就是说加了一个int元素应该占用的字节,这
样在数组中我们可以通过这种方式从上一个元素很方便的让指针变量指向下一个元素。p+5的话实际上是加了p+sizeof(int)5这么多
个字节。 另外一点事指针的类型决定了当指针解引用的时候其所以指向的内存单元中的二进制数据如何解释的问题。例如int p=&a;
那么(p)取得的数字就是一个整型数据,如果(((char )p))得到的就是一个字符型数据了。p本来指向的是int型数据(有4个字节)的
首地址,如果将其强制转换为一个指向char类型的指针变量,那么在解引用的时候只取第一个字节的数据,并将其解释为一个ascii码
代表的字符。 还有如果是一个指向函数的指针变量,我们可以通过此指针变量直接调用函数。例如int(function)(int);此时
function指向一个函数,此函数具有一个int参数,返回一个int值。那么通过指针可以这样调用该类型的函数了int a=function
(100); 或者int a=(function)(100);其实要不要解引用都是可以的。不过以前是需要解引用的,现在c标准规定这两种方法都可以。
总的来说指针的类型很重要。
2指针与数组。
我们向一个函数传递数组的时候一般是传递数组名,我们知道数组名是一个代表数组中第一个元素的地址并且数组名是不可以当左值
的。其实你又没有想过数组名到底是什么呢。有人说其实数组名就是一个指针常量,是一个不可以改变的指针常量。例如:int a[10]
={1,2,3,4,5,6,7,8,9,10}; 那么a可能的类型是int const a;注意const的位置(关于指针常量和常量指针,这个以后说),那么这种
说法到底对不对呢。我们可以通过sizeof运算符来计算某一种数据类型占用的存储空间。例如 sizeof(10)的值为4,注意这里我都假
设在32位的 *** 作系统上面编译。其实sizeof(10)和sizeof(int)是一样的,仅仅是求这种类型的数据占用多少内存空间,而不是说具体
的某个数据占用的空间,因为对于10这个文字常量来说根本不会占用内存空间的,其实随着程序直接编码到源程序中的,不存在分配
内存的问题。那么我们这样计算sizeof(a);是不是如我们所愿得到的是4呢。 结果可能会有意外,因为其值是sizeof(int)10也就是
40个字节,显然这个字节数是整个数组占用的字节数。而不是int 类型的指针变量占用的字节数,我们知道一个地址只占用4个字节
以上就是关于C++中如何把指针中的值取出来赋给常规变量全部的内容,包括:C++中如何把指针中的值取出来赋给常规变量、如何使用指针来存取数据、怎么 获取一个函数指针的地址值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)