有关指针和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.

浙公网安备 33010602011771号