(1)不要伤害指针--运算符&和*

原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6646001

增加自己的想法,作为笔记。

这里&是取地址运算符,*是间接运算符。

&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址。

*p 的运算结果就五花八门了。总之*p 的结果就是(注意这里,就是)p 所指向的东西,这个东西有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址。

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 的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b 来给*ptr 赋值就是毫无问题的了。
**ptr = 34; //*ptr 的结果是ptr 所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果是一个int 类型的变量。
时间: 2024-10-10 09:48:20

(1)不要伤害指针--运算符&和*的相关文章

C++中关于指针运算符->的重载问题

#include<iostream>using namespace std;struct date{ int year; int month; int day;};struct Person{ string name; int age; bool gender; double salary; date birth; Person() {  cout<<"创建persond对象"<<this<<endl;  age=10; } ~Perso

不要伤害指针(3)--指针和结构类型的关系

可以声明一个指向结构类型对象的指针. struct MyStruct { int a; int b; int c; }; struct MyStruct ss = {20,30,40};//声明了结构对象ss,并把ss 的成员初始化为20,30 和40. struct MyStruct *ptr = &ss;//声明了一个指向结构对象ss 的指针.它的类型是MyStruct *,它指向的类型是MyStruct. int *pstr = (int*)&ss;//声明了一个指向结构对象ss 的

不要伤害指针(5)--void和void指针详解

原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6587426 增加自己的想法,作为笔记. 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释

指针和指针运算符一起时的运算规则(比如*p++和*++p的区别)

接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1). 1.++i和i++的区别 如清单1(注意代码中的注释): [cpp] view plaincopy #include <stdio.h> int main(void) { int a, b, i = 7; i++; //等价于i = i + 1; ++i; //等价于i = i + 1; a = i++; //等价于a = i; i = i + 1; b = ++i; //等价于i = i + 1; 

不要伤害指针(4)--指针和函数的关系

可以把一个指针声明成为一个指向函数的指针.int fun1(char *,int); int (*pfun1)(char *,int); pfun1 = fun1; int a = (*pfun1)("abcdefg",7); //通过函数指针调用函数.可以把指针作为函数的形参.在函数调用语句中,可以用指针表达式来作为实参. 完全可以想象在内存的代码区有一个对象,通过这个对象.某个函数可以运行这个函数.我们这里的函数名和函数指针都是指向这个对象的.所以下面的几种调用都是合法的. #in

不要伤害指针(2)--指针的类型和指针所指向的类型

在谈论指针之前,永远记住指针的四要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存. 1. 指针的类型: 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型.这是指针本身所具有的类型.让我们看看例一中各个指针的类型: 1 int*ptr;//指针的类型是int* 2 3 char*ptr;//指针的类型是char* 4 5 int**ptr;//指针的类型是int** 6 7 int(*ptr)[3];//指针的类型是int(*)[3] 8

不要伤害指针(7)--指针类型转换

当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式.在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的. 例十五: float f = 12.3;float *fptr = &f;int *p; 在上面的例子中,假如我们想让指针p 指向实数f,应该怎么办?是用下面的语句吗? p = &f; 不对.因为指针p 的类型是int *,它指向的类型是int.表达式&f 的结

不要伤害指针(6)--指针的安全问题

看下面的例子: 例十八: char s = 'a'; int *ptr; ptr = (int *)&s; *ptr = 1298: 指针ptr 是一个int *类型的指针,它指向的类型是int.它指向的地址就是s 的首地址.在32 位程序中,s 占一个字节,int 类型占四个字节.最后一条语句不但改变了s 所占的一个字节,还把和s 相临的高地址方向的三个字节也改变了.这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的.也许这三个字节里存储了非常重要的数据,也许这三个字节里正好

C指针解析 ------ 运算符&amp;和*

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 & 是取地址运算符,* 叫做指针运算符或间接运算符.&a 的运算结果是一个指针,指针的类型是a的类型加上*,指针所指向的类型是a的类型,指针的值也就是指针所指向的内存区就是a的地址. *p的运算结果就多了,总之,*p的结果是p所指向的东西,这个东西有这些特点: 它的类型是p所指向的类型,它所占用的地址是p所指向的地址. 看下面的例子: int a = 5; int b;