指针(一)C语言指针问题
2017-03-14 10:30
148 查看
一. 用变量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);
指针是c/c++语言中一个重要的语言特性,但对于c/c++的初学者来说,却不是那么好理解。总起来说指针一个特殊的变量,这个变量能合法的使用*操作符对指针的变量内容进行提领(dereference)和成员访问。对于指针变量在它四个字节(32位平台)的内存里存储的数据是一个内存的地址值,也就是我们平时说的指向一个地址,而指针变量的类型则决定着对指针变量的所指向的地址里的数据的访问方式和从指向的地址开始往下所涵盖的范围。举例来说:
上述代码中指针变量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<
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<
相关文章推荐
- 指针问题:C语言中 int*p[4] 和 int(*p)[4]的区别 等等
- c语言指针运行出现问题
- C语言——通过调用函数改变形参指针 改变实参指针问题
- C语言指针减法问题
- C语言中有关二维数组的指针问题
- c语言初学-关于指针作为参数并改变它的值的问题
- c语言 指针问题
- c语言指针问题
- C语言中的二级指针和二维数组问题
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- c语言指针使用的注意问题
- C语言 复杂指针的申明问题 数组指针 指针数组 函数指针 指针函数一览无遗! C/C++求职面试必备考点(四)
- C语言中指针和自增运算符结合时的运算顺序问题
- C语言的指针移位问题
- C语言指针问题,初始化,赋值,以及字符数组,字符串常量等问题
- c语言指针问题小结
- C语言中的二级指针和二维数组问题
- C语言数组与指针的问题
- C语言一级指针、二级指针、数组作为参数传递需要注意的若干问题
- C语言中结构体与指针的若干问题(在数据结构中的应用)