对C/C++指针问题的彻底理解(复习1)

理解第一篇

上完大学不是我吹(仅仅说我认识的本学校的)估计很明白指针的人绝对不超过百分之50(因为问他们讲得断断续续的自己也说不明白,只知道那样可以用) 学链表树形结构.......等结构的时候一直困扰一个问题 例如int* a 和int  *a  ,*a,**a,int**a  或者说*******a 到底什么意思?大家都知道这是指针 ,指针本质是什么都说是地址.每次编程的时候都是报错了才能发现指针错误再去改正其实就是不太理解

例子 1

void Functionc()
 {
  int** a= (int** )5;
   printf("%d\n" ,a);
 }
//结果 a仍然是5    对应汇编指令 可以看到只是把5存到堆栈00410A56 rep stos dword ptr [edi]26: int** a= (int** )5;00410A58 mov dword ptr [ebp-4],527: printf("%d\n" ,a);00410A5F mov eax,dword ptr [ebp-4]

解: 不光是两个** 就算写成一万个星 打印结果仍然是5 因为不管是什么类型的或者你定义的结构体后面加*或者说加** 都相当于一个新的类型 



例二 & 和 * 的联系

假如你定义一个char a=10   假如你 &a 可以取到变量a的地址,你可以用char b=*a接收吗?不可以  !因为 &a 相当于 char* 类型的

那么假如char* b=&a  那么&b 是什么类型的? 对他是char** 类型的  每次加一个取地址符号就相当于类型后加个*

&取地址符条件 常量无法使用其他貌似都可以



例三

int* a 和int  *a 没有任何区别!!我们好多书上写第二种 其实第一种看的比较清楚  第二种代码比较好看

例如 int* x   其中x 和*x 区别 x 是int* 类型的,*x是 int 类型的 同理 int**  y    y是int**类型的 *y 是int*类型的 **y是int 类型的

 

前面可以用*x的条件 他的类型必须是个指针类型意思就是带一个或多个*

从汇编角度理解*p的意思如图

把10赋值给了堆栈   x值存储到【ebp-4】的地址   然而px把 ebp-4的值存到了【ebp-8】  相当于把 指向x的指针(地址)存到了【ebp-8】,

下面的int x1 =*px   把指向x的指针(地址)取出来放到ecx 又把指针指向的值(10)放到了 edx ,又把edx 放到了 【ebp-c】所在内存地址



未完待续.....

原文地址:https://www.cnblogs.com/xuexidememeda/p/12283845.html

时间: 2024-11-09 02:02:14

对C/C++指针问题的彻底理解(复习1)的相关文章

指针的入门和理解

/* ============================================================================ Name : TestPointer.c Author : lf Version : Copyright : Your copyright notice Description : 指针的入门和理解 一个程序载入内存时,系统会为变量和函数均分配内存,所以每个变量和函数都有其对应的内存 地址. 所以在C语言中有一个很常见的操作&就是用来取地

指针与链表结构理解

指针与链表结构理解#include<stdio.h>int main(void){ int a=3,*p; p=&a; printf("a=%d,*p=%d\n",a,*p); *p=10; printf("a=%d,*p=%d\n",a,*p); printf("Enter a:"); scanf("%d",&a); printf("a=%d,*p=%d\n",a,*p); r

指针、数组的理解与关系

一.指针的本质:变量,指针变量就是指针变量int *p:两个变量,一个p(指针变量本身)是int *类型的 另一个是*p(指针指向的那个变量)是int类型的注:指针说白了就是指针类型,前面定义的int类型是为了说明指针指向的那个数的类型,所以指针的解析方式都是按地址来解析的(不管你是char *还是double *,解析方式都是地址)而指向的那个数的类型就要看你怎么定义的了例如:int *aa是按照地址来解析的:*a则是按照int类型来解析的. (1)所有的类型的数据存储在内存中,都是按照二进制

结合示例说明C++中const和指针结合时怎么理解

在之前随笔<C++中const使用要点(一)>中简单叙述了const int*.int* const和const int* const的区别,记住三句话就能在实际运用时用对,但是看书时发现了指针常量.常量指针这些名词,发现明白这些概念对阅读文章时还是比较重要的. 关键:const和指针结合时代码从右往左看 1.常量指针(const pointer) 概念:常量是形容词,也就是说常量指针是一个指针,用const修饰的指针. 按照代码从右往左(概念名词从左往右)的阅读顺序,不妨试着写一下. Ste

指针数组的简单理解

1 #include <stdio.h> 2 /* 3 研究类型,步长,数组名和二级指针的关系 4 */ 5 int main(void) 6 { 7 char *p[4] = {"1234","sq34","d234","4234"}; 8 //万变不离其中:数组名 == 首元素的地址 9 //1.整体研究 10 printf("sizeof(p) = %d\n",sizeof(p));//p

指针强制类型转换的理解

前几天在判断  “值相同的两个指针所指向的变量的值可以不同 ”  这句话时,发现自己对指针类型一些概念仅仅是记住了结论.于是查阅了一些资料,记录一下一些与指针类型和指针类型转化相关的知识.    一些用到的 开始之前,先来复习一些会用到的知识. 1.地址,字节,位 位(bit)是电子计算机中最小的数据单位.每一位的状态只能是0或1. 字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit). 地址可以理解为在一片内存中,每个字节(Byte)的编号. 他们在内

空类型指针(void *)的理解

void指针是空类型指针,它不指向任何类型,即void指针仅仅是一个地址,所以空类型指针不能进行指针运算,也不能进行间接引用(因为指针运算和间接引用都需要指针的类型信息). 例如: void * p; //仅仅表示p存放一个地址 p++; //error:+.-运算离不开指针类型 *p=20.5; //error:访问p指向的变量空间需要变量类型信息 由于其他指针都包含有地址信息,所以将其他指针的值赋给空类型指针是合法的:反之,将空类型指针赋给其他指针则不被允许,除非进行显式转换. 例如: in

指针与链表的理解

一.指针的概括 1.指针的类型       基本数据类型比如 int.char ,还有 一些复杂的比如 int (*p)[], 指向数组的指针,像这种的判断就是指针名字去掉 , 指针的类型类型就是 int(*)[],其实就是指向数组的指针  2.指针所指向的类型 当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待.  你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型. 例如:int*ptr:指针所指向的

复杂的指针结构应如何理解

1. 数组的定义 数组由数组元素的类型,数组名,[]以及数组长度构成. int a[10] = {0}; //显式的数组长度10 int b[] = {1, 2, 3}; //隐式的数组长度3 2. 指针的定义 C++语言使用*符号把一个标识符声明为指针. int *p1, *p2; //p1 and p2 point to an int string *pstring; //pstring points to a string 3. 函数指针的定义 函数指针由标识符,返回值,参数列表组成 vo