好朋友?陌生人?-------指针与数组

2024-01-15 23:48
文章标签 数组 指针 朋友 陌生人

本文主要是介绍好朋友?陌生人?-------指针与数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数组:用来保存一组相同类型的元素的集合,通常用于固定数目且类型相同
指针:专门用来保存一个变量的地址,即指针就是地址,通常用于动态数据结构



数组的定义:

int arr[5]={1,2,3,4,5};
 
指针的定义: 

int a=0;

int *p=&a;
 

数组:一但定义后,编译器会为它分配一段连续的存储单元,数目开始时就会直接或间接的被固定,看起来

          虽然比较整洁,但写法比较死板,同样也比较浪费空间。

指针:指针存放的是一个地址值,指向某个单元,可以通过该指针来索引此单元,在编程和思路构建过程中

          有很大的灵活性。

类似的,

指针数组:即数组元素全部为指针的数组,数组中的每个元素都是指针,本质为数组

数组指针:即指向数组首元素地址的指针,本质为指针

指针数组的定义:

int *arr[5];
 

数组指针的定义:

int (*p)[5];



二维数组和指针数组:

二维数组:如int arr[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且

该空间一定是连续的。其每个元素表示一个字符。我们可以通过制定下标对其元素进行修改。

指针数组如int *arr[5] 系统至少会分配5个连续的空间用来存储5个元素,表示arr是一个5个元素的

数组,每个元素是一个指向整型数据的一个指针。

如果我做这样的定义:

char a[3][8]={"gain","much","strong"};                                         

 char *n[3]{"gain","much","strong"};

他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了

3×8的空间,而给指针n分配的空间则取决于具体字符串的长度。

此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。

由此可见,相比于比二维字符数组,数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制

在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二

维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。



二维数组和数组指针:

例如:{int a[4][5]; int (*p)[5]=a;}这里a是个二维数组的数组名,相当于一个二级指针常量;

p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;

*p+i是二维数组a[0][ i ] 的地址;

*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。


指针和数组的联系:

char *p="abcdef";
*(p+2)----->c//通过指针形式访问c
p[2]-------->c//通过数组形式访问cint arr[10]={1,2,3,4,5,6};
*(arr+6)=7;//通过指针形式将第七个元素赋值为7
arr[6]=7;//通过指针形式
 
定义成数组,声明成指针------>错误 

定义成指针,声明成数组------->可以用*(char**) 或(char*)*(int*)方式实现

add.c
[cpp] view plain co
  1. char *a="abcdef";
  1. test.c  
[cpp] view plain copy  在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2.   
  3. extern char a[];  
  4. extern print();  
  5.   
  6. int main()  
  7. {  
  8.                 print();  
  9.                 printf( "%p\n", a);  
  10.                 printf( "%s\n", a);  
  11.                 printf( "%s\n", *(char **)a);  
  12.                 printf( "%s\n", (char *)*(int *)a);  
  13.                 return 0;  
  14. }  

可以用以下方式进行进一步说明:

int a=10;
int *arr[10];//指针数组----存放指针的数组
int (*ptr)[10];//数组指针----指向数组的指针
int *p=&a;//一级指针
int **q=&p;//二级指针
int (*ptr)[10]=&arr;//将指针数组首元素的地址赋值给数组指针
int *(*ptr)[10]=*arr;//将指针数组的值赋值给数组指针的解引用
 



个人能力有限,如有问题,请帮忙提出!


这篇关于好朋友?陌生人?-------指针与数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/610613

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

菲律宾诈骗,请各位华人朋友警惕各类诈骗。

骗子招聘类型:程序开发、客服、财务、销售总管、打字员等 如果有人用高薪、好的工作环境来你出国工作。要小心注意!因为这些骗子是成群结伴的! 只要你进入一个菲律宾的群,不管什么类型的群都有这些骗子团伙。基本上是他们控制的! 天天在群里有工作的信息,工作信息都是非常诱惑人的。例如招“打字员”、“客服”、“程序员”……各种信息都有。只要你提交简历了,他会根据你的简历判断你这个人如何。所谓的心理战嘛!

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou