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

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中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::