当前位置:网站首页>C语言——指针和数组、指针数组和数组指针、指针和二维数组
C语言——指针和数组、指针数组和数组指针、指针和二维数组
2022-08-09 14:44:00 【Lydialyy】
一、指针和数组
1.虽然数组和指针关系密切,但数组绝不是指针。
代码举例:
#include <stdio.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;
}运行结果:

2.数组名其实是数组第一个元素的地址!
代码举例1:
#include <stdio.h>
int main()
{
char str[128];
printf("请输入内容:");
scanf("%s",str);
printf("str 的地址是:%p\n",str);
printf("str 的地址是:%p\n",&str[0]);
return 0;
}运行结果:

代码举例2:
#include <stdio.h>
int main()
{
char a[] = "LoveC";
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.3, 4.4, 5.5};
printf("a[0] -> %p, a[1] -> %p, a[2] -> %p\n", &a[0], &a[1], &a[2]);
printf("b[0] -> %p, b[1] -> %p, b[2] -> %p\n", &b[0], &b[1], &b[2]);
printf("c[0] -> %p, c[1] -> %p, c[2] -> %p\n", &c[0], &c[1], &c[2]);
printf("d[0] -> %p, d[1] -> %p, d[2] -> %p\n", &d[0], &d[1], &d[2]);
return 0;
}
运行结果:

3.指向数组的指针
char *p;
p = a; // 语句1
p = &a[0]; // 语句24.指针的运算
- 当指针指向数组元素的时候,可以对指针变量进行加减运算,这样做的意义相当于指向距离指针所在位置向前或向后第n个元素。
代码举例:
#include <stdio.h>
int main()
{
char a[] = "LoveC";
char *p = a;
printf("*p = %c, *(p+1) = %c, *(p+2) = %c\n", *p, *(p+1), *(p+2));
return 0;
}
运行结果:

- 对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法。
- 注意:p+1并不是简单地将地址加1,而是指向数组的下一个元素。
代码举例:
#include <stdio.h>
int main()
{
int b[5] = {1, 2, 3, 4, 5};
int *p = b;
printf("*p = %d, *(p+1) = %d, *(p+2) = %d\n", *p, *(p+1), *(p+2));
return 0;
}
运行结果:

二、指针数组和数组指针
1.指针和数组的区别
数组名只是一个地址,而指针是一个左值。
注:C语言的术语lvalue 指用于识别或定位一个存储位置的标识符。(注意:左值同时还必须是可改变的)
代码举例:
#include <stdio.h>
int main()
{
char str[]="I love C!";
char *target=str;
int count = 0;
while(*target++ !='\0')
{
count++;
}
printf("总共有%d个字符!\n",count);
return 0;
}
运行结果:

2.指针数组和数组指针

结论:指针数组是一个数组,每个数组元素存放一个指针变量。
代码举例:
#include <stdio.h>
int main()
{
char *p1[5] = {
"让编程改变世界",
"Just do it",
"一切皆有可能",
"永不止步",
"One more thing"
};
int i;
for(i = 0; i < 5; i++)
{
printf("%s\n",p1[i]);
}
return 0;
}运行结果:


结论:数组指针是一个指针,它指向的是一个数组。
代码举例:
#include <stdio.h>
int main()
{
int temp[5] = {1, 2, 3, 4, 5};
int (*p2)[5] = &temp;
int i;
for(i = 0; i < 5;i++)
{
printf("%d\n", *(*p2 + i));
}
return 0;
}运行结果:

三、指针和二维数组
1. *(array + 1)== array[1]
代码举例:
#include <stdio.h>
int main()
{
int array[4][5] = {0};
int i, j, k = 0;
for(i = 0;i < 4;i++)
{
for(j = 0;j <5;j++)
{
array[i][j] = k++;
}
}
printf("*(array + 1): %p\n",*(array + 1));
printf("array[1]: %p\n",array[1]);
printf("&array[1][0]: %p\n",&array[1][0]);
printf("**(array + 1): %d\n",**(array + 1));
return 0;
}运行结果:

2. *(*(array + 1)+ 3 ) == &array[1][3]
添加两行代码即可证明:
printf("*(*(array + 1) + 3): %d\n",*(*(array + 1) + 3));
printf("array[1][3]: %d\n",array[1][3]);运行结果:

3.结论
- *(array + i)== array[ i ]
- *(*(array+i)+j) == array[ i ][ j ]
- *(*(*(array+i)+j)+k) == array[ i ][ j ][ k ]
4.数组指针和二维数组
初始化二维数组是可以偷懒的:int array[2][3]={ {0,1,2},{3,4,5}};
可以写成int array[][3]={ {0,1,2},{3,4,5}};
定义一个数组指针是这样的:int(*p)[3];
那么如何解释这条语句:int(*p)[3]=array;
代码举例:
#include <stdio.h>
int main()
{
int array[2][3] = {
{0, 1, 2}, {3, 4, 5}};
int (*p)[3] = array;
printf("**(p + 1): %d\n", **(p + 1));
printf("**(array + 1): %d\n", **(array + 1));
printf("array[1][0]: %d\n", array[1][0]);
printf("*(*(p + 1) + 2): %d\n", *(*(p + 1) + 2));
printf("*(*(array + 1) + 2): %d\n", *(*(array + 1) + 2));
printf("array[1][2]: %d\n", array[1][2]);
return 0;
}运行结果:

边栏推荐
猜你喜欢

【DevOps】jekins配置(二)

VSTO踩坑记录(2)- 运用outlook对象模型发送邮件

R7 6800H标压处理器+RTX 3050独显 无畏Pro15锐龙版高能开卖

Use Baidu EasyDL to realize intelligent identification of health code/travel code in 30 minutes

VMWare不使用简易安装,手动安装ISO操作手册

爬虫处理乱码问题

spacedesk-笔记本、平板、扩展屏幕-解决平板字体太小的问题

常见自动化测试工具及框架的选用

代码随想录笔记_动态规划_377组合总和IV

Regular expression combat: the latest Douban top250 crawler super detailed tutorial
随机推荐
零时科技 | Nomad 跨链桥被盗1.8亿美元事件分析
YOLOv5网络详解
Simulink simulation pid control servo system
[LeetCode] 485.最大连续 1 的个数
The rising star DPU is revolutionizing the data center!
6大论坛,30+技术干货议题,2022首届阿里巴巴开源开放周来了!
[Database] How does Sqlserver backup the database regularly and clear it regularly
MySQL lock mechanism and lock algorithm
回归测试:意义、挑战、最佳实践和工具
simulink仿真pid控制伺服系统
概率论基础知识整理 | 随机向量
跨境电商独立站?Lighthouse: WooCommerce!
After reading the "Redis In-depth Notes" compiled by Tencent bosses in 90 days, I worshipped on the spot.
【LeetCode】1898. 可移除字符的最大数目
Dapp系统开发及智能合约部署技术
table中 You may have an infinite update loop in a component render function问题解决
深圳堡垒机厂家有哪些?重点推荐哪家?
30分钟使用百度EasyDL实现健康码/行程码智能识别
外贸软件如何提升进出口公司业绩 实现降本增效
Computer Graphics From Scratch - Chapter 5