不保证绝对正确,学习中所记录的一些笔记罢了,可能随着经历的增多,逐渐的完善,

不要完全相信我所记录的内容,可能因为编译协议版本的不同出现不同的结果。

也可能我写的根本就是错的,请相信自己动手得出来的结果。------寒暄的风

普通的指针

 #include<stdio.h>
int main()
{
int *p,a;
p=&a;
}

它的意思是一个指针变量p储存了变量a的内存地址。

*p的意思是指向了p本身所储存的内存地址。

普通指针和数组

#include<stdio.h>
int main()
{
int a[],*p;
p=a;//这种情况总共有三种表示方法,*(p+0),p[i],*p
/*当然如果我们不用指针也可以对数组进行这样的操作,*(a+0),*a,a[i]
  我们之所以敢用*运算符,那是因为数组的数组名就是第一个元素的内存地址
  为什么数组可以直接用指向运算符*进行加减运算呢,那是因为加的1就是数组的类型内存大小
  简单的来说就是数组的步长值就是其类型的单个大小,加1后刚好会跳入下一个内存区域。
  至于指针的问题,和上面类似,只不过指针的步长值根据的是指针的类型,指针和所指向的变量他们的类型都是一样的,为的就是确定
  指针加1后其步长值能跳入下一个内存区域。*/
}

如果指针的类型和所指向的变量类型不一样怎么办呢?

#include<stdio.h>
int main()
{
int a[]={,,};//其他的值会被填充成0;
char *p;
p=a;
printf("%d\n",p[]);//不会显示正确的结构,因为步长值不对
//int是4,char是1,p[4]才能访问到第二个内容。是*(p+4)的另一种表示方法。
}

两者类似,但是又有所不同。(根据多次的操作尝试,数组名可能是编译器内置的一个常量) 上面多种的指针和数组的表示方式,和下面的二位数组有着非常大的关系

二维数组------>一个指向指针的指针

普通的二维数组

 #include<stdio.h>
int main()
{
int a[][]={,,,};
printf("%d--%d--%d--%d\n",*(a[]+),a[][],*(*(a+)+),(*(a+))[]);
} //因为指针本身也是一个变量,他自己也有在内存中的地址。

数组指针

数组指针int (*p)[3]; 他的意思是一个指向数组元素为3的指针变量。显示的写法同上面一样。

 #include<stdio.h>
int main()
{
int a[][]={,,,};
int (*p)[];
p=a;
printf("%d--%d--%d--%d\n",*(p[]+),p[][],*(*(p+)+),(*(p+))[]);
}

一维数组和二维数组,指针的区别

如果你建立了一个指针,想要像二维数组名那样的访问,这个指针必须是数组指针,其格式为int (*)p[2]

既然有数组指针和普通指针之分
那么数组指针和普通指针到底有甚么区别呢?
1.普通指针只能p[1]的形式来访问二维数组,假设a[2][2],这个数组有4个元素,那p[3],就代表了p访问这个数组的第4个元素。
2.数组指针,(*)p[2],假设a[2][2],哪我们就不能用普通指针的方式来访问这个二维数组。应该用*(p[0]+0),p[0][0],*(*(p+0)+0),(*(p+0))[0]
//为什么会造成这种差异呢?*(*p+3)访问到第4个元素
/*那是因为和数组指针方括号里面的值有关,例如如果是2的话,那就代表着他的类型大小*2,所以p+1,就是p+类型大小*2

 #include<stdio.h>
int main()
{
int a[][]={,,,};
int (*p)[]=a;
printf("%p-%p",p,*p);
//经过测试,p的值和*p的值是一样的,都是二维数组a的首元素的内存地址,但是不同的是他们的步长值,p的步长值是类型大小*2,2即是他方括号里的数字。
//*p的步长值就是他类型大小
//*(*p+3)的结果是4,这就可以看出p和*p的步长值区别了
}

指针数组

指针数组 int *p[3]; 这个指针有三个元素,分别是p[0],p[1], p[2]。特性和普通的数组一样,数组名即首元素的内存地址。
指针数组操作字符串
char *p[3]={"hello","world","nihao"};
这是一个指针数组,可以解释为p[0]这个元素储存的值是h的内存地址。所以*p+0指向的h的内存地址。
如果要访问某行某列的值怎么访问呢?
*(*(p+1)+1)读取第2行第2个内容,等同于p[1][1],*(p[1]+1),(*(p+1))[1]

 *(*(p+)+)读取第2行第2个内容,等同于p[][],*(p[]+),(*(p+))[]
#include<stdio.h>
int main()
{
char *p[]={"hello","woeld","nihao"};
printf("%p\n",p);//是指针数组p第一个元素的内存地址
printf("%p\n",(p+));//是指针数组p第二个元素的内存地址
printf("%p\n",p[]);//是指针数组p第一个元素所储存的内存地址,也就是h的内存地址。
printf("%p\n",*(p+));//是指针数组p第一个元素所储存的内存地址,也就是h的内存地址。
printf("%c\n",*(p[]));//p[0]原本储存的是h的内存地址,再一次指向后,会显示h
printf("%c\n",*(*(p+)));//*(p+0)原本储存的是h的内存地址,再一次指向后,会显示h
printf("%c\n",*(p[]+));//p[0]原本是h的内存地址,加1后会跳到e的内存地址上,然后指向,会显示e
printf("%c\n",*(*(p+)+));//*(p+0)原本是h的内存地址,加1后会调到e的内存地址上,然后指向会显示e
}

c语言指针篇的更多相关文章

  1. C语言指针篇(一)指针与指针变量

    指针 1. 什么是指针?    2. 指针可不可怕? 3. 指针好不好玩? 4. 怎么学好指针?     C语言是跟内存打交道的语言,指针就是内存地址.指针无处不在,指针并不可怕,相反,等你学到一定程 ...

  2. C语言指针篇(二)多级指针

        多级指针         多级指针常常使用于数组.这里仅仅介绍一下它长什么样,后文会再次详细对比使用.         多级指针呢,常见的有二级指针.见图.             二级指针的 ...

  3. 瘋子C语言笔记(指针篇)

    指针篇 1.基本指针变量 (1)定义 int i,j; int *pointer_1,*pointer_2; pointer_1 = &i; pointer_2 = &j; 等价于 i ...

  4. 快速上手系列-C语言之指针篇(一)

    快速上手系列-C语言之指针篇(一) 浊酒敬风尘 发布时间:18-06-2108:29 指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂.当然指针不是万能的,但没 ...

  5. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  6. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  7. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  8. C语言指针基本操作

    C语言指针基本操作 指针  指针介绍 如果说C语言最有魅力的地方在哪,那么毋庸置疑,非指针莫属了. 众所周知,C语言中每个变量都有一个内存地址,可以通过&进行访问.指针是一个变量,它的值是一个 ...

  9. C语言指针的高级操作

    C语言指针的高级操作 指针  指针 在上篇博客中我介绍了C语言指针的最基本操作,那么我在这篇博客中会介绍一下C语言指针的一些骚操作. 指向指针的指针 这名字乍一听有点拗口,再次一听就更加拗口了.先看定 ...

随机推荐

  1. UML 运用于开发过程——总结

    UML -- 统一的图形语言 用例图:需求捕获,测试依据类图:静态系统结构对象图:对象之间的关联构件图:构件之间的关联部署图:构建的物理部署 以上几种图的作用:描述系统结构 顺序图:捕获时间顺序协作图 ...

  2. vuejs code splitting with webpack 3种模式

    我们知道一个web app如果太大会严重影响用户的体验,如何能够最快速度地让用户看到完整页面是优化web应用需要做的重要工作. 这其中使用code split实现lazy加载,只让用户初次访问时只加载 ...

  3. Oracle EBS PO采购订单更新

    DECLARE l_result NUMBER; l_progress NUMBER; l_errors PO_API_ERRORS_REC_TYPE; l_chg PO_CHANGES_REC_TY ...

  4. 从零开始导入gradle项目

    需要jdk1.8,idea17以上,电脑安装gradle(配置环境变量,与配置java类似),用git的push命令下项目,开始操作 gradle配置本地仓库位置:添加环境变量GRADLE_USER_ ...

  5. Fuckey V1.0 Beta版发布!!!

    Fuckey,以前叫FullNexus4,只因为当时想做一个软件给自己的Nexus 4,方便方便一下,不过这名字感觉太局限了,毕竟很多朋友不是使用的Nexus 4的手机,但却还是使用了FullNexu ...

  6. UITextField使用的一些细节

    UITextField使用的一些细节 这篇博文是我自己使用UITextField的一些总结,并没有太多营养,并会持续更新. 2014.9.15 ---------------------------- ...

  7. javascript excel

    js做的 excel ,  http://handsontable.com/  js keyCode对照表  http://dwz.cn/Lknbz

  8. 企业大数据之Elasticsearch的搜索类型

    下面的 ES基于版本(V2.3.4) ES之默认 1.默认自动发先同一局域网的所有集群节点 2.默认一个索引库会有5个分片,(分片越多,效率越好) 由于这两个默认,所以统一索引库的分片对分布在不同机器 ...

  9. python3: 字符串和文本(2)

    6. 字符串忽略大小写的搜索替换 >>> text = 'UPPER PYTHON, lower python, Mixed Python' >>> re.find ...

  10. VRS外部文件

    igs08_1708.atx:IGS卫星和接收机段天线PCO改正 Configure:配置文件