欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

c 语言学习指针 - 几个概念的指针

最编程 2024-05-05 17:56:16
...

 1.指针的类型

基本数据类型比如 int、char ,还有 一些复杂的比如 int (*p)[], 指向数组的指针,像这种的判断就是指针名字去掉 , 指针的类型类型就是 int(*)[],其实就是指向数组的指针

   2.指针所指向的类型

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。  你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

     例如:int*ptr:指针所指向的类型是int   int(*ptr)[3]:指针所指向的的类型是int()[3] 

   3.指针的值

我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。 

 看一段代码:这段代码是问你p1 是否和p2 相等?

#include "stdio.h"

int main()
{
    char *p1,*p2,*p3;
    char ch[] = {'a', 'b', 'c'};
    char **pp;
    p1 = ch;
    pp = &ch;
    p2 = *pp;
    
    if (p1 == p2) {
      printf("p1  == p2n");
    } else {
      printf("p1 != p2n");
    }

    printf("p3 = %p", p3);
    return 0;
}

  结果是:

//p1 != p2

//p3 = 0x4005f0dxy

&ch  指针类型为 char (*)[3], 当运行到pp=&ch 时候,编译器会骂你 “warning: assignment from incompatible pointer type” 指针类型不匹配(在vc6下直接报错)。看一下p3 会有一个值,未初始化指针是有内存地址的,而且是一个垃圾地址。不知道这个内存地址指向的值是什么。这就是为什么不要对未初始化指针取值的原因。最好的情况是你取到的是垃圾地址接下来你需要对程序进行调试,最坏的情况则会导致程序崩溃。以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里? 

还有一个题目可以试试

#include "stdio.h"

int main()
{
  int a[5] = {1,2,3,4,5};
  int *p = (int *)(&a+1);
  printf("%d,%d", *(a+1), *(p-1));
}

答案在此