有关指针和C语言中的常量

 

常量类型(五种):

字面常量(2,3,6....) ;                           enum 定义的枚举常量;

字符常量('a','b'....) ;                          const 定义的常变量;

#define 定义的 宏常量.

 

' * ' 的功能:

1): * 在两个变量或常量之间  =>  表示乘法 (a*b,a*10 ...);

2):* 左边是类型,右边是变量时 => 表示声明 声明该变量为一个指针变量;

3)* 左边为空右边为指针变量时 => 表示解引用(指向) .

 

指针相关:

1) 定义指针变量时,系统会将*和变量相结合 =>(int* p,r;//定义了一个指针变量p,一个整形变量);

 代码:

int main()
{
    int* p, a;
    return 0;
}

 

类型如下图所示:

2) 定义/使用指针时要注意(野指针\空指针\失效指针)尤其是野指针!因此要将指针初始化(*p=NULL);

int* Fun()
{
    int ar[] ={1,2,3,4};
    return ar; //因为在函数调用结束后,系统会回收给函数所分配的栈空间,所以在函数调用结束后,ar就变成了失效指针.
}
int main()
{
    int* pa;//此时pa为一个野指针,它指向的位置不确定,因此
                    //会给程序带来意想不到的后果,所以必须置为空.
    pa = NULL://将其置为空.
    int *ip = Fun();//此时ip所指向的是一个随机值.
    return 0;
}

 

3) 指针大小在32位操作系统占4字节,64位操作系统占8字节;

4) 使用指针变量,要明确指针本身的值(存储的是地址) , 以及指针指向的值(指针变量所指的实体)(解引用);

例:

#include<stdio.h>
int main()
{
    int ar[5] = { 12,23,34,45,56 };
    int* ip = ar;
    int x = 0, y = 0;
    x = *ip++;  //等价于 ip++; x = *ip;
    y = *ip;
    printf("x = %d,y = %d\n", x, y);
x
= ++ * ip; y = *ip; printf("x = %d,y = %d\n", x, y);
x
= *++ip; y = *ip; printf("x = %d,y = %d\n", x, y); return 0; }

 

运行结果:

 

 运行结果分析:

1.++ 以及 * 两个运算符优先级是相同的,且结合方向为从右向左:

 

 分析:

第一个打印结果: x = *ip  ++  => x=*(ip++),又因为后置++先运算再加一,所以x=*ip, 而y = *(ip+1),ar 指向的是数组首元素的地址,所以ip指向的也是,,ar[0],所以x = 12,y = 23;

第二个打印结果:x = ++*ip ,此时ip指向的是ar[1],即23,x = ++*ip   => x = ++(*ip),即ip所指向的值前置加一,所以x = y = 24;

第三个打印结果:ip先自加之后指向ar[2],即34的位置,所以解引用后*ip == 34,所以x= y = 34;

 

5) 指针类型决定了指针的加一的能力.(p = p + 1  =>  p = p + sizeof(typename)*1);

例:

int main()
{
    int ar[3] = { 1,2,3 };
    char ch[10] = { "hell0" };

    int* ip = ar;

    char* cp = ch;

    return 0;
}

 

打开监视器,我们可以看到,ip +1,和ip 相差四个字节的位置,即sizeof(int),而cp 和 cp +1相差一个字节的位置,即sizeof(char);

 

 

6) 指针类型决定了指针对内存操作的能力.

例:

#include<stdio.h>
int main()
{
    int a = 0x12345678;

    int* ip = &a;
    char* cp = (char*)(&a);
    short* sp = (short*)(&a);

    int ix = *ip;
    char cx = *cp;
    short sx = *sp;

    printf("ix = 0x%0x\ncx = 0x%0x\nsx = 0x%0x\n", ix, cx, sx);
    return 0;
}

 

 运行结果:

 

 

const 和指针

const  int *p = &a     const 在 * 的左边,const 修饰的是指针的指向能力.等价于  int const *p = &a,即不可更改*p的值,但是可以更改p本身的值: p=&b true,但*p = 200 false

int * const p =&a       const 在 * 的右边,const 修饰的是指针自身的值,即不可更改p本身的值,但可以更改*p的值 p=&b false,但*p = 200 true.

 

posted @ 2021-03-23 17:24  Wz_qq_2***6  阅读(63)  评论(0)    收藏  举报