指针和数组|学习笔记

简介: 快速学习指针和数组

开发者学堂课程【你的第一门 C 语言课指针和数组】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/444/detail/5472


指针和数组


内容介绍:

一、 指针与数组的概念及其区别 

二、指针数组案例

三、 数组名的真实身份

四、 指向数组的指针

五、指向的运算

 

一、指针与数组的概念及其区别

指针和数据是相像的而不是相同的概念。

概念: 

数组:数组是用于储存多个相同类型数据的集合。

指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。

区别:

1.赋值:

同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝

2.存储方式:

数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,多维数组在内存中是按照一维数组存储的,只是在逻辑上是多维的。

数组的存储空间,不是在静态区就是在栈上。

指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。

由于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。

 

二、 指针数组案例

#incLude .h>

int main( )

{

int a;

int *p = &a;

printf("请输入一个整数: "):

scanf ("%d",&a);

printf("a = %d\n", a) ;

printf("请重新输入一个整数: ");

scanf("%d", p);

printf("a = %d\n",a);

return 0 ;

}

#include

int main( )

{

char str[128] ;

printf("请输入鱼C的域名: ");

scanf(“%s”,str) ;

printf("鱼C工作室的域名是: %s\n",str);

return 0 ;

}

 

三、 数组名的真实身份 

数组名其实是数组第一个元素的地址! 

代码:

#include <stdio.h>

int main()

{

char [] = "FishC";

int b[5]={1,2,3,4,5};

float c[5] ={1.1,2.2,3.3,4.4,5.5};

double d[5] ={1.1,2.2,3.34.4,5.5};

printf("a[0]-> %p,a[1]-> %p,[2]>%p\n",&a[0],&a[1],&a[2];

printf("b[0]-> %p,b[1]-> %p,[2]>%p\n",&b[0],&b[1],&b[2];

printf("c[0]-> %p,c[1]-> %p,[2]>%p\n",&c[0],&c[1],&c[2];

printf("d[0]-> %p,d[1]-> %p,[2]>%p\n",&d[0],&d[1],&d[2];

return 0;

}

 

四、指向数组的指针

如果用一个指针指向数组,应该怎么做呢?

Char *p;

p = a;//语句1

p =&a[0]; //语句2

数组指针指向的是数组中的一个具体元素,而不是整个数组,所以数组指针的类型和数组元素的类型有关,上面的例子中,p 指向的数组元素是 int 类型,所以 p 的类型必须也是int*

 

五、 指针的运算

1.当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于指向距离指针所在位置向前或向后第 n 个元素。

2.对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法

3.需要郑重强调的是: p+1并不是简单地将地址加1而是指向数组的下一个元素。

代码:

#include <stdio.h>

int main()

{

char [] = "FishC";

int b[5]={1,2,3,4,5};

float c[5] ={1.1,2.2,3.3,4.4,5.5};

double d[5] ={1.1,2.2,3.34.4,5.5};

printf("*b = %d, *(b+1) = %d, *(b+2) = %d\n", *b, *(b+1),*(b+2));

return 0;

}

#incLude  

#include

int main( )

{

char *str = "I love FishC.com!";

int i;

length = strlen(str) ;

for (i = 0; i < length; 1++)

{

printf("%C", str[i]);

}

printf("\n");

return 0;

}

数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用 sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

相关文章
|
1月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
35 3
|
17天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
21天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
21天前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
21天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
24天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
44 4
|
1月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
39 2
|
1月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
39 1
|
2月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
2月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。