C语言指针总结
指针:
指针定义
定义:指针是一个变量,用来存放地址的变量
指针基本类型
(1)基本类型:
int,short,long,float,double,char; 如int *p;//表示定义一个指针,这个指针指向整形变量,这个指针将存放的是整型变量的地址。
(2)数组指针:
指针指向一个数组
int (*a)[10];//表示指针指向一个int型的长度为10的数组。
(3)函数指针:
指针指向一个函数
void (*a)();//表示指针指向一个无参数无返回值的函数
指针引用
指针引用后得到的是该地址所对应的变量的值。
二级指针
指向一级指针地址的指针
指针的运算 :
(1)指针+或者-一个数,表示指针加减这个数的类型所占内存的整数倍
如 int *p=a;
p=p+2; // 在VC6.0里面,实际上p加了2 * 4=8
(2)指针减去一个指针,表示两个指针之间所差的内存单元或者元素个数,两个指针相加没有意义
(3)关系运算,如果定义了两个指针变量p和q,并且都已经初始化了,
如果p==q,则表示p和q指向同一个地址
p>q,则表示p指向高地址而q指向低地址
也经常拿p和NULL做比较,用来表示指针当前的状态,这在数据结构中应用非常广泛,比如说链表的查找等等
指针和数组的关系:
指针和数组关系密切,数组可以通过指针去引用,数组可以存放指针,数组也可以由指针去访问,指针也能存放数组的地址
多维数组与指针的关系:
指针与数组的区别:
//字符串的地址
#include<stdio.h>
#define MSG “我是真的吊”//创建字符串 会先存储在静态存储区----没运行时不会为其分配内存
int main(void) {
char ar[] = MSG;//这个是把静态存储区的字符串给ar数组
char ar2[] = MSG;//所以这个地址是会不一样的 会变的
char ar3[] = “hehe”;
const char pt = MSG;//这个就是把字符串的地址拷贝给指针 printf("“我是真的吊"的地址:%p\n”, “我是真的吊”);*
printf(“ar的地址:%p\n”, ar); printf(“ar2的地址:%p\n”, ar2);
printf(“ar3的地址:%p\n”, ar3); printf(“ar[0]的地址:%p\n”,&ar[0]);
printf(“ar2[0]的地址:%p\n”, &ar2[0]);
printf(“ar2 - ar的差:%td\n”, ar2 - ar); printf(“ar3 - ar2的差:%td\n”, ar3 - ar2);
printf(“pt指向的地址:%p\n”, pt); printf(“MSG的地址:%p\n”, MSG);
printf("“我是真的吊"的大小%d:\n”, sizeof(MSG));
printf(“ar3的大小%d:\n”, sizeof(ar3));
return 0;
}
//我的理解: // ar的地址和其他的不一样 不应该都是指向字符串的地址吗 //初始化数组把静态存储区的字符串拷贝到数组中-----------而初始化指针只把字符串地址拷贝给指针
自我理解:
//总结: //指针的本质就是一串数字 是一种数据类型 这种数据是针对地址操作的 这种数据类型有很多不同的类型 //–数字的范围–也就是字长—也就是寻址大小 //------比如说 一个内存为1000字节(bit) 为其编号就是0~999 最多999 999二进制就是 11 1110 0111 这就需要10位二进制 10bits来管理系统的地址—系统的字节编号 //------现在内存变大 4个G 算出需要32位二进制表示 系统需要32bits 用16进制表示地址的编号就是 0X654A 6754这样 //–数字的作用
//指针的操作
//–注意指针的类型 和指针所指向的类型 指针指的方向*********
//-------指针的类型----你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型 intptr;//指针的类型是int--------------去指针名就是指针类型
//-------指针指向的类型----你只须把指针声明语句中的指针名字和名字左边的指针声明符去掉,剩下的就是指针所指向的类型 intptr; //指针所指向的类型是int------------去指针名和* 就是指针指向的类型
//----指针指的方向-------指向内存区的首地址
//指针所占内存
//—用sizeof 32位系统中 指针占4字节 也就是说 int是4个字节 char是一个字节 int是4个字节 char是4个字节(后面两个是指针类型)
//&是取地址运算符,*是间接运算符—&a 的运算结果是一个指针(指针是地址 这个地址放的东西是别人的地址 指针一定是地址 地址不一定是指针)----*p 后面接地址 的结果是p 所指向的东西 它的类型是p 指向的类型,它所占用的地址是p所指向的地址
//–指针进行自增 自减操作------每次都会增加或减少指针类型大小的范围(sizeof(char))×n
//指针加指针 指针减指针 ----+操作不允许 因为不知道会加到那个地方去 可以进行-操作 一般用于数组中
//左值 1.必须相同类型 (int*与int**就不是同一类型----&只能操作左值) 2.必须是纯变量(不能是变量加常量----纯变量系统才能为其分配内存) 3.当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值
//也就是说要明确的占据内存
const限定符:
k,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA3NDczNg==,size_16,color_FFFFFF,t_70)
undefined