指针(一)C语言指针问题

来源:互联网 发布:java有项目培训吗 编辑:程序博客网 时间:2024/05/16 22:30

一. 用变量a给出下面的定义
a)一个整型数
int a;
b)一个指向整型数的指针(Apointertoaninteger)
int *a;
c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoanintege)
int **a;
d)一个有10个整型数的数组(Anarrayof10integers)
int a[10];
e)一个有10个指针的数组,该指针是指向一个整型数的。(Anarrayof10pointerstointegers)
int *a[10];
f)一个指向有10个整型数数组的指针(Apointertoanarrayof10integers)
int (*a)[10]
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)
int (*a)(int)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)
int (*a[10])(int);

#include<iostream>using namespace std;int main(){   char *str[]={"welcome","to","Fortemedia","Nanjing"};   char**p=str+1;   str[0]=(*p++)+2;   str[1]=*(p+1);   str[2]=p[1]+3;   str[3]=p[0]+(str[2]-str[1]);   cout<<str[0]<<endl;   cout<<str[1]<<endl;   cout<<str[2]<<endl;   cout<<str[3]<<endl;  system("pause");  return 0;}

指针是c/c++语言中一个重要的语言特性,但对于c/c++的初学者来说,却不是那么好理解。总起来说指针一个特殊的变量,这个变量能合法的使用*操作符对指针的变量内容进行提领(dereference)和成员访问。对于指针变量在它四个字节(32位平台)的内存里存储的数据是一个内存的地址值,也就是我们平时说的指向一个地址,而指针变量的类型则决定着对指针变量的所指向的地址里的数据的访问方式和从指向的地址开始往下所涵盖的范围。举例来说:

#include<iostream>using namespace std;int main(){    int i[2]={1073741824,-1073741824};    int *p1=&i[0];    char *p2=(char*)&i[0];    float *p3=(float*)&i[0];    printf("%d->%d/n",p1,*p1);    printf("%d->%d/n",p2,*p2);    printf("%d->%f/n",p3,*p3);    p1++;    p2++;    p3++;    printf("%d->%d/n",p1,*p1);    printf("%d->%d/n",p2,*p2);    printf("%d->%f/n",p3,*p3);    system("pause");}

上述代码中指针变量p1,p2,p3指向相同的地址值,都是i[0]所标识的内存的地址值,但由于指针的类型不同,导致用运算符进行提领时,*p1,*p2,*p3的值不一样。当p1用提领p1所指向的内存里的数据时,由于p1是int*型的,所以会从地址值为&i[0]开始,往下涵盖四个字节(sizeof(int))的内存,然后把里面的数据安照int变量的存储方式解析成一个int型数值。1073741824在内存&i[0]~&i[0]+3中存储是0x00,0x00,0x00,0x40,(小段机 补码存储),所以p1的值是1073741824。而p2是char型的,所以仅从地址值为&i[0](sizeof(char))的内存把里面的数据按照char变量的存储方式解析成一个char型数值,由于地址值为&[i]的内存里是0x00,所以p2为0.同样由于p3是float型的,所以会从地址值为&i[0]开始,往下涵盖四个字节(sizeof(float))的内存,然后把里面的数据安照float变量的存储方式解析成一个float型数值。由于float型变量的存储方式不同于整型,c/c++浮点数存储遵循ieee标准,按照标准*p3的值为2.0(具体请参见本博客里一篇关于float内存布局的博文,不再赘述)。另外从上述代码我们可以看到,指针变量的类型还影响着指针变量算术运算时的跨度,即指针变量+1时,指针变量的值会增加sizeof(指针所指向变量的类型)。

弄明白上面所分析的是掌握指针的关键(个人是这么看的),基于刚才的分析来看开始的笔试题:

首先在line 5声明一个指针数组,而str的值就是数组的起始地址值,str的值被默认解析成char **变量的值。

line6声明了一个2级指针,char**p=str+1;由于str是char**型,即str指向的类型是char 型的,所以p的值是(int)str+sizeof(char),显然p指向了str的第二个元素即str[1]的地址。

line7 :(p++)+2;,由于后置运算符++优先级比高,所以先进行++运算,p的值变为(int)p+sizeof(char*),,显然此时p指向了str[2]的地址,再进行运算,由于后置是++返回未变化的p的值,取到了str[1]的值,即指向字符串”to”的指针的值,由于*p类型是char的所以](*p++)+2;最终str[0]指向了“to”结尾的’/0’所以输出str[0]时为空。

line8:str[1]=*(p+1);,显然str[1]指向了字符串”Nanjing”的首地址。cout<

0 0