C++指针相关问题

1、指针的类型和指针所指向的类型

如定义一个指针 int *ptr,  指针ptr的类型是int*,而指针所指向的类型是int。

例1:

int *p; //指针p类型是int*
int a;
char b;
p=&a;   //指针p指向类型是int,a为int型,该语句可使p指向a
*p=10; //即使得a=10

但语句 p=&b; 错误,因为在声明语句int *p; 中就表示了p指向的类型是int,而b是char类型,故该语句不合法

2、*与&的理解

&为取地址运算,运算结果是个指针,如&a表示a的地址,如a是int型,则结果为int *,可以有int *p=&a;

*是间接运算,如*p表示p指向的东西,即以p为地址的存储单元里的东西,可以有int b=*p;(p要先初始化,不然p未指向任何地址,是个不确定的东西,该语句就不正确,这里仅作示意就省略了。。。)

例2:

int a=12;
int b;
int *p;
int **ptr;
p=&a;//&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。
*p=24;//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a。
ptr=&p;//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int**。该指针所指向的类型是p的类型,这里是int*。该指针所指向的地址就是指针p自己的地址。
*ptr=&b;//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以?amp;b来给*ptr赋值就是毫无问题的了。  p重新指向b,即p=&b;
**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。                即使得b=34;     

3、数组和指针的关系

声明了一个数组TYPE array[n],则数组名称array就有了两重含义:

第一,它代表整个数组,它的类型是TYPE [n];

第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。(而*(array+1)可以,这只是访问元素,并没有使得array=array+1)

访问数组可以通过array[i]或者*(array+i)的方式进行,两者含义相同。

例3

char *str[3]={
"Hello,this is a sample!",
"Hi,good morning.",
"Hello world"
};
char s[80];
strcpy(s,str[0]);//也可写成strcpy(s,*str);
strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即‘H‘的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char *。 
*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good morning."的第一个字符‘H‘,等等。

4、指针和结构类型的关系

例4

struct MyStruct
{
int a;
int b;
int c;
}  

MyStruct ss={20,30,40};//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。
MyStruct *ptr=&ss;//声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。
int *pstr=(int*)&ss;//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。

//比较推荐的访问结构体元素的方式是:ptr->a;  ptr->b;  ptr->c;
 

5、指针和函数的关系

可以把一个指针声明成为一个指向函数的指针。

例5

int fun1(char*,int);
int (*pfun1)(char*,int);
pfun1=fun1;
....
....
int a=(*pfun1)("abcdefg",7);//通过函数指针调用函数。 
int a= fun1("abcdefg",7); //常用的函数名调用函数
 

函数的指针很少用,一般调用函数直接用函数名即可,两种方式结果相同。

本文是在参考了http://www.cnblogs.com/ggjucheng/archive/2011/12/13/2286391.html的 基础上总结了自己的 一点理解。

时间: 2024-10-06 12:14:09

C++指针相关问题的相关文章

《C++ Primer》学习 之 函数指针相关用法

/* 函数指针相关用法*/ 1 #define _CRT_SECURE_NO_WARNINGS 2 #define HOME 3 //#define NDEBUG 4 #include <iostream> 5 #include <stdexcept> 6 #include <cassert> 7 #include <ctype.h> 8 #include <locale> 9 #include <iterator> 10 #incl

和指针相关的两个特殊运算符,和相关的等价表达式

和指针相关的两个特殊运算符: 一."&" 取地址运算符,通过&运算符可以取出普通变量的地址: 二."*"  有两种意义: 1.  为指针标志: 是否为指针标志主要看前面是否有类型,此处有一个int 2.  为指针运算符:    在等号右面为取值.*可以取出指针变量所指向的普通变量的值.   在等号左面为赋值.*可以将指针变量所指向的普通变量的值,修改为其他. 3.  为乘法运算符.当且仅当左右的都为变量时.略. 如 int a, b =20, c=3

指针相关总结1

指针相关总结1 指针是数组的迭代器(指针就是迭代器). 0.字符串数组: char a[3][25]= {"XUANXIU YUWEN ", "XUANXIU YUWEN", "FEIXUANXIU TIYU"};就行了 定义成二维数组存储时可以简单看作一排一个字符串数组, char* a[10] = {"XUANXIU", "YUWEN", "XUANXIU", "SHUXU

指针相关知识

1.指针:内存地址 指针变量:专门用一个变量来存放指针,这种变量成为指针变量.因此,一个指针变量的值就是某个内存单元的地址(或指针) “指针”是指地址,是常量,“指针变量”是指取值为地址的变量 2.二级指针 指针变量中主要存放目标变量的地址,这种指针称为一级指针.如果指针变量中存放的不是变量的地址,而是存放一级指针变量的地址,则这种指针称为二级指针. 格式: [存储类型]  数据类型符    **变量名: 例如: int a=5; int *p1; int **p2; p1=&a; p2=&

【C语言】【指针相关知识小结】

1.int *p = NULL 和 *p = NULL的区别 int *p = NULL指的是将一个指针初始化为NULL,具体过程为 int *p; p = NULL. 2.&a与a的区别 int a[5]; int *p = &a;//?? int *q = a;//?? 这样的代码对吗? 解释: &a得到数组的地址. a表示数组首元素的首地址. &a的a的值一样,两个指向的位置是相同的,但是意义不同. 3.指针和数组的定义与声明 什么是声明和定义: C语言中的对象必须只

指针相关

指针指向的都是一个代表内存地址的长的十六进制数.一位十六进制数需要四个2进制数表示,即0.5字节. 指针存的是一个地址,在32位操作系统里面,最大寻址空间位0~2^32-1,即4个字节(32位)就可以表示,相应的在64位操作系统环境中用8个字节表示指针,16位系统2字节. 指针本身所占空间大小与所指对象所占空间大小无关,只与操作系统能够有关.

C语言指针相关面试题

在分析指针的代码时,脑子里一定要有一张内存的分配图,用于分析各个变量的存储情况. 1.用变量a给出下面的定义 a) 一个整型数(An integer) b)一个指向整型数的指针( A pointer to an integer) c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r d)一个有10个整型数的数组( An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的

C++学习---指针相关

1.指向 “指针对象” 的 ”指针” 一般指针 int *p1,ival =42; p1 = &ival; 或者 int ival =42,*p1=&val; 代表一个指针对象指向一个同类型的地址区域,如果想要得到值用解析符*即可 *p1 //p1存储的是一段内存地址,*符号解析该地址等到值42 指向 指针对象 的 指针 上图是指向int对象的指针,而现在的对象则是指针对象. int i = 42,*p1,**p2 ; p1 = &i; p2 = &p1; 需要使用**是有

指针相关笔记

指针的简单介绍: /** 目的:指针的定义及简单介绍时间:2015年7月15日10:43:50 */ #include <stdio.h> int main(void){ int i = 3; int j; int * p; //p是变量的名字,int * 表示的是p只能存放int * 类型的变量的地址 // error cannot convert from 'int' to 'int *' 因为p只能存放int类型变量的地址,而不能存放int类型变量的值 // p = i; //p = 5