认识C指针的类型。

遇到一个好玩的错误,大家一起来看看

#include <stdio.h>

int main()

{

  int a=10;

char b=1;

  int *p;

  p=b;

  printf("b的值是:%d",*p);

  return 0;

}

  本意是想通过指针p去间访字符b,以ASCII码的方式打印出来,而字符b在内存中的只是1.所以预期打印出来的应该是 1.

而结果却是给出了一个警告,

warning: incompatible integer to pointer conversion assigning to
      ‘int *‘ from ‘char‘ [-Wint-conversion]
    p=b;
     ^~

  仔细一看才知道指针P的类型写成了  int。改成char后正常。

  笔者也是初学,一番研究之后才搞明白。按道理说,无论你把指针定义成什么类型的,它在内存中总是占着8个字节。那么,指针的类型存在的意义是什么呢?

简单来说,指针类型的作用体现在访问和赋值的时候,而且很重要。当我们在定义 int a=10;的时候,系统会为a分配相应的内存空间去存放a,int型为八个字节,在内存中也就是

00000000 00000000 00000000 10100000,

然后定义字符b=1,系统会在a的后面继续的存储b,而b是char类型的,占1个字节。也就是00000001,那么着连续的5字节中存着两个值,

00000000 00000000 00000000 10100000 00000001。

而指针p中存得时b的地址值,当我们通过*p去访问b时实际上就是从p中存得地址值开始去一一取值,那么取到什么地方停止呢?这个时候既要看指针的类型了,代码中p的类型是int,大家知道int占4个字节,那么通过*p去取值就会相应的取4个字节,也就是

00000000 00000000 10100000 00000001,

这当然已经不是b原来的值了。新版本的编译器不允许类型的混乱。老版本的编译器给出警告但是依旧会运行成功,打印出00000000 00000000 10100000 00000001对应的10进制数。当然是错误的。

  同样的,当我们用指针去访问一个类型与指针类型不一样的变量并给它赋值的时候,也会出现相似的错误。看起来很小的一个知识点,实际上却是很重要的。

时间: 2024-10-14 11:12:36

认识C指针的类型。的相关文章

指针的本质---如何确定指针的类型

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍 一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一 个类型里会出现很多运算符,他们也像普通的表达式一样,有优先 级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧: int p; int *p; //这是一个普通的整型变量 //首先从 P 处开始,先与*结合,所以说明 P 是一 //个指针,然后再与 int 结合,

指针的类型和指针所指向的类型说明

指针的类型和指针所指向的类型说明 2010-03-17 15:24 1774人阅读 评论(1) 收藏 举报 编译器c 1.指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部 分就是这个指针的类型.这是指针本身所具有的类型.让我们看看例一中各 个指针的类型: (1)int*ptr;//指针的类型是int* (2)char*ptr;//指针的类型是char* (3)int**ptr;//指针的类型是int** (4)int(*ptr)[3];//指针的类型是int(*)[3]

指针的内容 &nbsp; 指针的地址 指针所指向的内容 指针的类型 指针所指向的类型

这几个个东东很具有迷惑性. int a=10;      //假设a的地址是 0x0000004C int *p;           //假设p的地址是 0x0035FA94 p=&a; 指针的内容:指针里面存放的是地址. 指针p里面存放的是a的地址(&a).即指针p里面存放的内容是0x0000004C. 指针的地址:指针本身的地址. 指针p的地址就是&p.指针p的地址是0x0035FA94 指针所指向的内容:也就是指针里面存放的地址,那块地址里面存放的内容,通过对指针进行*引用

指针的类型与指针所指向的类型

指针的类型和指针所指向的类型很明显是不一样的东西,但好多情况下却容易忽视它们的区别.指针的类型是指针自身的类型,而指针所指向的类型是指针指向的数据(内存)的类型. 指针的类型 从语法上来看,我们只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型.如: 1 int *ptr; //指针的类型是 int* 2 char *ptr; //指针的类型是 char* 3 int **ptr; //指针的类型是 int** 4 int (*ptr)[3]; //指针的类型是 int(*)[3]

明显调用的表达式前的括号必须具有(指针)函数类型 编译器错误 C2064

看到“明显调用的表达式前的括号必须具有(指针)函数类型”这句时我才发现我的语文水平有多烂,怎么看都看不懂,折腾了半天才知道是哪里出了问题. 举个简单的例子 class CTest { void (CTest::*m_pFun)(); void CallFun() { (this->*m_pFun)(); //OK,对象指针和函数名一定要用括号括起来,函数名前面要加上*号 this->*m_pFun(); //error (this->m_pFun)(); //error } //本文链接

指针-&gt;指针的类型

指针的类型: 从语法的角度来讲,只要将指针声明中的指针名字去掉,剩下的就是指针的类型: 指针声明 指针类型 int *p int *:int 类型的指针 chat *p chat *:char 类型的指针 int *p[3] int *[3]:int 类型的指针数组 int (*p)[3] int (*)[3]:int 类型的数组指针 int **p int **:int类型的指针的指针

虚函数调用中的指针类型转换以及指针所指类型的本质

父类类型指针可指向子类对象,调用子类对象重写的虚函数,一条代码即有了不同的表现结果,也就是多态. 很显然,子类重写的虚函数里调用的自然是子类的成员变量,父类类型指针是无法直接访问到子类的成员变量的.那么既然是父类类型指针调用的子类的虚函数,那么传给this的自然就是父类类型的指针,那么又如何能访问到子类的成员变量呢? 细心想一下就明白了,this指针也是有类型的,其类型就是类本身类型,所以子类的虚函数中,this指针的类型就是子类类型,因此当父类类型的指针作为实参传进去时,会强制转换成子类类型指

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

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

c指针点滴-指针与类型

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //数据通信 5 void main() 6 { 7 int num = 10; 8 int *p1 = &num; 9 int *p2 = p1; 10 printf("\n%d,%d,%d",num,*p1,*p2); 11 printf("\n%x,%x,%x",&num,p1,p2); 12 13 *p2 = 20; 14 p