指针和数组|学习笔记

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

开发者学堂课程【你的第一门 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 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

相关文章
|
19天前
|
搜索推荐 C语言
指针与数组
指针与数组
47 9
|
26天前
|
算法 Java
双指针在数组遍历中的应用
文章深入探讨了双指针技术在数组遍历中的应用,通过实战例子详细解释了快慢指针和首尾指针的不同用法,并提供了解决LeetCode相关问题的Java代码实现。
|
19天前
|
存储 程序员 C语言
指针的高级应用:指针数组、数组指针、函数指针等。
指针的高级应用:指针数组、数组指针、函数指针等。
58 0
|
22天前
|
存储 C++
c++学习笔记06 指针
C++指针的详细学习笔记06,涵盖了指针的定义、使用、内存占用、空指针和野指针的概念,以及指针与数组、函数的关系和使用技巧。
28 0
|
2月前
|
运维
开发与运维数组问题之指针的加减法意义如何解决
开发与运维数组问题之指针的加减法意义如何解决
36 7
|
2月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
20 6
|
2月前
|
存储 C++ 运维
开发与运维数组问题之指针的定义语法如何解决
开发与运维数组问题之指针的定义语法如何解决
24 6
|
3月前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
3月前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
42 2
|
3月前
|
C语言
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
28 1