别人写的一篇特别好的对指针的理解------让你不再害怕指针——C指针详解(经典,非常详细)
这里做一个自己的总结和整理:
一.指针是什么:
-
什么是指针:指针是一个值为内存地址的变量.
-
指针的作用:个人感觉指针最好用的地方在于它使数据之间的"传递"变的很方便,比如:程序在某个地方需要操作一个数据或者一块数据,这时候可以通过调用指针去寻找所需数据的地址,进而得到想要的数据.
-
指针的类型:
这里要分清:1.指针的类型 2.指针所指向指向的类型
二.指针的运算
.
- 算术运算:
1.指针可以相减,得到的是内存地址的差值
2.指针的自增自检运算:相当于指向的地址值加减(sizeof(指针指向数据类型大小))大小的字节数 - 运算符*和&
1.&—取地址符—得到的是变量的地址
2.是间接运算符—简单的说就是得到后面地址里存放的数据
后面懒得总结了–贴上之前的思维导图做的笔记和自我总结
当时的理解
//总结:
//指针的本质就是一串数字 是一种数据类型 这种数据是针对地址操作的 这种数据类型有很多不同的类型
//--数字的范围--也就是字长---也就是寻址大小
//------比如说 一个内存为1000字节(bit) 为其编号就是0~999 最多999 999二进制就是 11 1110 0111 这就需要10位二进制 10bits来管理系统的地址---系统的字节编号
//------现在内存变大 4个G 算出需要32位二进制表示 系统需要32bits 用16进制表示地址的编号就是 0X654A 6754这样
//--数字的作用
//指针的操作
//--注意指针的类型 和指针所指向的类型 指针指的方向*********
//-------指针的类型----你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型 int*ptr;//指针的类型是int*--------------去指针名就是指针类型
//-------指针指向的类型----你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型 int*ptr; //指针所指向的类型是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限定符
. 多维数组与指针的关系
指针与数组的区别
//字符串的地址
#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的地址和其他的不一样 不应该都是指向字符串的地址吗
//初始化数组把静态存储区的字符串拷贝到数组中-----------而初始化指针只把字符串地址拷贝给指针
结果: