指针数组和数组指针|学习笔记

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

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

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


指针数组和数组指针


目录

指针和数组的区别

指针数组和数组指针

 

一、指针和数组的区别

1计算一个字符串里面的字符个数打开 Oracle VM VirtualBox 软件输入代码

代码如下

#include

int main( )

{

char str[] = "I love FishC. com!";

int count=0;定一个变量用来计算这个字符的个数

while (*str++ != '\0' )  

{

count++ ;

}

Printf("总共有%d个字符!\n",count );   打印结果

return 0;

}

[fishc@localhost s1e23]$ vi test1.c

[fishc@localhost sle23]$ gcc test1.c && ./a. out

test1.c: In function ' main' :

test1.c:8: error: lvalue required as increment operand指针运算符的操作对象操作数必须是一个左值

[fishc@localhost sle23]$

2、str 必须是一个 lvalue,str 是数组的名字数组名是不是左值呢

从定义上来看,C 语言的术语 Ivalue 指用于识别或定位一个存储位置的标识符。

( 注意:左值同时还必须是可改变的)数组名定义的就是数组的位置数组名是不可修改的它是一个地址常量字符串的地址所以要对代码进行修改 

修改后的代码如下

#include

int main( )

{

char str[] = "I love FishC. com!";

Char *target=str指向字符串

int count=0;  

while (*target++ != '\0' )  用 target 进行处理这是一个复合语句复合表达式操作数有两个运算符对它进行作用一个是自增运算符一个是取值运算符运算符的优先级自增运算运算符比取值运算符高一个级别

所以先运算 target++,后缀运算符有一个特性作用效果要在下一条语句才会显示虽然是自增但是这一句还是使用 target 本身的值*target 值跟\0匹配是否等于字符串的结束符如果不是就加1,如果是就退出循环再下一次碰到的时候target 是++后的结果以此类推计算出总共有多少个字符

{

count++ ;

}

Printf("总共有%d个字符!\n",count );  

return 0;

}

[ fishc@localhost s1e23]$ gcc test1.c && ./a. out

总共有17个字符!

3最后可以从这个程序看出指针变量跟字符串名字有什么区别同样都是指向地址但是指针变量是一个左值字符串名字是地址常量不是左值因为++运算符要对 target 进行赋值必须是可改变的target 本身指向1,++后指向2,++指向3,如此反复

4、结论数组名只是一个地址而指针是一个左值

 

二、指针数组和数组指针

1、指针数组是数组数组指针是指针

2、:int *p1[5];int (*p2)[5];哪个是指针数组哪个是数组指针

(1)int *p1[5]是指针数组

从运算符的优先级和结合性入手定义同时有取值运算符和下标运算符作用于变量p1,数组下标比取值运算符级别高所以 p1[5]先结合p1被定义为具有5个元素的数组所以它是数组数组类型不是整型从运算符的优先级和结合性入手定义同时有取值运算符和下标运算符作用于变量p1,数组下标比取值运算符级别高所以

下标

0

1

2

3

4

元素

Int*

Int*

Int*

Int*

Int*

结论指针数组是一个数组每个数组元素存放一个指针变量

指针数组如何初始化呢代码如下

#include  

int main( )

{

int a=1;

Int b=2;

int c=3;

int d=4;

Int e=5;

int *p1[5] = {&a, &b, &c, &d, &e];

int i;

for(i=0;i<5;i++)

{

printf("%d\n", *p1[i]);

}

return 0 ;

}

[ fishc@localhost s1le23]$ gcc test2.c && ./a . out

1

2

3

4

5

指向字符指针时的代码如下

#incLude <stdio.h>

int main( )

{

char *p1[5] = {

"让编程改变世界--鱼C工作室",

"Just do it--NIKE",

"一切皆有可能--李宁",

"永不止步--安踏",

"One more thing.. --苹果"

};

int i;

for(i=0;i<5;i++)

{

printf("%s\n", p1[i]);

}

return 0 ;

}

[ fishc@localhost s1le23]$ gcc test3.c && ./a . out

让编程改变世界--鱼C工作室

Just do it--NIKE

一切皆有可能--李宁

永不止步--安踏

One more thing.. --苹果

2)int (*p2)[5]是数组指针

从运算符的优先级来看它们在同一级所以从结合性来看左到右就是左边的先结合p2先被定义为指针变量指针变量的类型指向元素的类型所以int 定义的是数组元素的类型

下标

0

1

2

3

4

元素

Int

Int

Int

Int

Int

结论数组指针是一个指针它指向的是一个数组

数组指针如何初始化呢

warning 是它认为代码有问题但还是会尊重程序员进行编译执行error 就是编译不成功p2是一个指针所以要给它一个地址编译器提醒指针类型初始化不一致数组名是数组第一个元素的地址

正确代码如下

#include

int main( )

{

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

int (*p 2)[5]=& temp;

指针指向的是数组一个的元素的地址指向整型变量的指针指向第一个元素而不是数组虽然数组第一个元素的地址等于数组名等于数组的地址但是概念不同数组的所有元素都是挨个存放的当知道第一个元素的地址时要变量它所有元素也是没有问题的。

所以这里不是要一个变量的地址而是要一个真正的身份数组把它当作一个整体取出这个数组的地址才是这个数组指针想要的内容

int i;

for(i=0;i<5;i++)

{

printf("%d\n", *(*p2+ i));  *p2表示数组的地址+i是取出它的值

}

return 0 ;

}

[fishc@localhost s1e23]$ gcc test4.c && ./a. out

1

2

3

4

5

相关文章
|
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月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。