有关指针类型的定义问题
为什么在定义指针时要求必须和该指针所指向的变量类型相一致?是为了系统的寻找方便吗?还是这样要求是系统处理时有其他的原因?请高手指点!...
为什么在定义指针时要求必须和该指针所指向的变量类型相一致?是为了系统的寻找方便吗?还是这样要求是系统处理时有其他的原因?请高手指点!
展开
展开全部
这是肯定的,要知道指针变量存在着加减运算,指针就是地址,那么指针变量里面存放的就是指针(也就是地址)。请看:
int a[3]={1,2,3};
char b[3]={'a','b','c'0};
int *pi=a;
char *pc=b;
那么此时pi和pc里面其实都存放的是计算机内存地址,其实在32为的计算机中就是4个字节的数字,这4个字节的数字就表示了一个内存单元的具体地址。那么
如果我要访问a[0]可以这样*pi其实就是对a[0]的访问,如果要访问a[1]可以这样: *(pi+1) 。
同样对于字符数组b来说通过*pc可以访问到b[0]的值,通过*(pc+1)可以访问到b[1]的值,那么你有没有想过,整型数据占用的内存空间与字符数据是不一样的呢。整型数据占用的字节数字是与机器的字长有关的,例如在32为的机器上整型数据占用4个字节,也就是32为,在以前的dos机器上(也就是16位机器)整型数据占用2个字节,例如在turbo C下面编译int占用2个自己,char占用1个字节,在VC++ 6.0上编译int占用4个字节,char占用1个字节,这里我们以VC++ 6.0作为例子
pi+1之后就指向了数组的第二个元素,同样pc+1之后也只想了b数组的第二个元素,虽然他们都是指向了数组的第二个元素,但是他们移动的字节数是不一样的。
例如在b数组中,b[0]和b[1]他们是紧挨着的两个字节,而在a数组中a[0]和a[1]他们每个都占4个字节,所以&a[0]和&a[1]是相差4个字节的。
所以pi++和pc++他们移动的实际字节数不一样,这在谭浩强的书中都有详细的讲到。
那么一个指针有两部分组成,首先其是一个指针类型,其次其指向的是什么类型的数据,其指向的数据类型是区分不同指针的一个重要特征。
int * p; 与 char * p1; 中p和p1是不同的指针,他们一个事指向字符,一个是指向整形数据的。 当我们以*p和*p1来访问他们指向的内存单元时,编译器对他们的解释是不一样的,一个是将其指向的内存单元当做是字符来解释,一个是将其指向的内存单元当做整型数据来解释的。并且在从内存中获得数据的时候也会根据指针指向的数据类型来决定取出指针指向的地址后面的连续多少个字节的数据,其实这些数据在内存中都是以二进制的01来表示的,如果我们单独来看这些数据他们就是一样的,不代表任何特殊的含义,他们都是二进制数据而已,但是编译器在解释这些数据的时候就会进行不同的转换。
还有指针指向的数据类型决定了其操作。例如有下面的指针变量:
int (*p)(int a ,int b);
p=max;
这里p实际上是一个指向函数的指针变量,其指向的函数具有两个int类型的参数,并且函数返回一个int类型的数据。
那么我们可以使用此指针来调用函数int c=p(10 ,5);
其实此时p变量中也是存在的是一个地址的,此地址就是该函数的入口地址。如果p是一个int *类型的变量,那么这样进行函数调用就不行了。
另外我们说指针变量里面存放的就是指针,也就是一个地址,说白了地址就是一个数字用来标示内存的,也就是用来给内存编号的。我们可以进行强制转换:
char a='A';
char *p=&a;
int *p1=(int *)p; //将p强制转换为指向整型数据的指针。
cout<<*p1<<endl; // 输出'A'的ASCII码值65.
希望对你有帮助。
int a[3]={1,2,3};
char b[3]={'a','b','c'0};
int *pi=a;
char *pc=b;
那么此时pi和pc里面其实都存放的是计算机内存地址,其实在32为的计算机中就是4个字节的数字,这4个字节的数字就表示了一个内存单元的具体地址。那么
如果我要访问a[0]可以这样*pi其实就是对a[0]的访问,如果要访问a[1]可以这样: *(pi+1) 。
同样对于字符数组b来说通过*pc可以访问到b[0]的值,通过*(pc+1)可以访问到b[1]的值,那么你有没有想过,整型数据占用的内存空间与字符数据是不一样的呢。整型数据占用的字节数字是与机器的字长有关的,例如在32为的机器上整型数据占用4个字节,也就是32为,在以前的dos机器上(也就是16位机器)整型数据占用2个字节,例如在turbo C下面编译int占用2个自己,char占用1个字节,在VC++ 6.0上编译int占用4个字节,char占用1个字节,这里我们以VC++ 6.0作为例子
pi+1之后就指向了数组的第二个元素,同样pc+1之后也只想了b数组的第二个元素,虽然他们都是指向了数组的第二个元素,但是他们移动的字节数是不一样的。
例如在b数组中,b[0]和b[1]他们是紧挨着的两个字节,而在a数组中a[0]和a[1]他们每个都占4个字节,所以&a[0]和&a[1]是相差4个字节的。
所以pi++和pc++他们移动的实际字节数不一样,这在谭浩强的书中都有详细的讲到。
那么一个指针有两部分组成,首先其是一个指针类型,其次其指向的是什么类型的数据,其指向的数据类型是区分不同指针的一个重要特征。
int * p; 与 char * p1; 中p和p1是不同的指针,他们一个事指向字符,一个是指向整形数据的。 当我们以*p和*p1来访问他们指向的内存单元时,编译器对他们的解释是不一样的,一个是将其指向的内存单元当做是字符来解释,一个是将其指向的内存单元当做整型数据来解释的。并且在从内存中获得数据的时候也会根据指针指向的数据类型来决定取出指针指向的地址后面的连续多少个字节的数据,其实这些数据在内存中都是以二进制的01来表示的,如果我们单独来看这些数据他们就是一样的,不代表任何特殊的含义,他们都是二进制数据而已,但是编译器在解释这些数据的时候就会进行不同的转换。
还有指针指向的数据类型决定了其操作。例如有下面的指针变量:
int (*p)(int a ,int b);
p=max;
这里p实际上是一个指向函数的指针变量,其指向的函数具有两个int类型的参数,并且函数返回一个int类型的数据。
那么我们可以使用此指针来调用函数int c=p(10 ,5);
其实此时p变量中也是存在的是一个地址的,此地址就是该函数的入口地址。如果p是一个int *类型的变量,那么这样进行函数调用就不行了。
另外我们说指针变量里面存放的就是指针,也就是一个地址,说白了地址就是一个数字用来标示内存的,也就是用来给内存编号的。我们可以进行强制转换:
char a='A';
char *p=&a;
int *p1=(int *)p; //将p强制转换为指向整型数据的指针。
cout<<*p1<<endl; // 输出'A'的ASCII码值65.
希望对你有帮助。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询