入门学习计算机第十六天——指针进阶(一)
发布日期:2021-06-28 16:38:48 浏览次数:3 分类:技术文章

本文共 2716 字,大约阅读时间需要 9 分钟。

入门学习计算机第十六天——指针进阶(一)

编译器:Microsoft Visual Studio 2010

前言

字符指针

字符指针: char*

int main(){
char* p ="abcdef";//"abcdef"是一个常量字符串,指针内存放的是首元素的地址。 printf("%c\n",*p); printf("%s\n",p); return 0;}

输出的结果是

a
abcdef

有一道笔试题:

int main(){
char arr1[]= "abcdef"; char arr2[]= "abcdef"; const char* p1 ="abcdef"; const char* p2 ="abcdef"; if(arr1 == arr2) {
printf("hehe\n"); } else {
printf("haha\n"); } if(p1 == p2) {
printf("hehe\n"); } else {
printf("haha\n"); } return 0;}

输出的结果是

haha
hehe

为什么输出haha?

arr1 与 arr2 是两个数组,创建了两个不同的空间,所以两个数组的首元素地址也不相同。
为什么输出hehe?
p1与p2指向的是同一个常量字符串,并且内容都是不可修改的。C会把常量字符串储存到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际指向同一块内存,所以p1,p2指向的是一个空间,所以是相等的。

指针与数组

指针数组

主体是数组

int* arr[10];//整型指针的数组
char* arr2[4];//一级字符指针的数组
char** arr3[5];//二级字符指针的数组

int main(){
char arr1[] = {
1,2,3,4,5}; char arr2[] = {
2,3,4,5,6}; char arr3[] = {
3,4,5,6,7}; const char* parr []= {
arr1, arr2 ,arr3}; int i =0; for(i = 0; i < 3 ; i++) {
int j = 0; for(j = 0; j <5; j++) {
printf("%d", *(parr[i]+j)); } printf("\n"); } }

在这里插入图片描述

数组指针

主体是指针

数组指针,能够指向数组的指针

int main(){
int* p =NULL;//p是整型指针,指向整型的指针,存放整型的地址 char* pc = NULL;//pc是字符指针,指向字符的指针,存放字符的地址 int arr[10]={
1,2,3,4,5,6,7,8,9,10}; int(*p)[10] = &arr;//数组的地址要存起来 //上面的p就是数组指针,p先和*结合,说明p是一个指针变量,然后指向的是一个大小为10个整型的数组 return 0;}
void print(int arr[3][5],int x ,int y){
int i = 0; int j =0; for(i = 0; i

输出的结果都是

12345
23456
34567

由上述的代码可知

printf("%d ",p[i][j]);printf("%d ",*(p[i]+j));printf("%d ",*(*(p+i)+j));printf("%d ", *(p+i)[j]);  //四种方式都等价

int arr[5];

arr是一个5个元素的整型数组

int* parr1[5];

parr1是一个数组,数组内有5个元素,每一个元素的类型是Int* ,parr1是一个指针数组

int (*parr2)[5];

parr2是一个指针,该指针指向一个5个元素的整型数组

int(*parr3[10])[5];

parr3是一个数组,该数组有10个元素,每一个元素是一个数组指针

该数组指针指向的数组有5个元素,每个元素的类型是int

在这里插入图片描述

数组参数,指针参数

一维数组传参

void test(int arr[]){
}void test(int arr[10]){
}void test(int* arr){
}void test2(int *arr[20]){
}void test2(int **arr)//所有函数的传参都是正确的{
}int main(){
int arr[10] = {
0}; int *arr2[20] = {
0}; test(arr); test2(arr2); return 0}

二维数组传参

void test(int *arr)//err{
}void test(int* arr[5])//err{
}void test(int (*arr)[5])//正确{
}void test(int **arr)//err{
}int main(){
int arr[3][5]={
0}; test(arr);}

一级指针传参

void print(int *p , int sz){
int i = 0; for(i=0; i

思考:test和test2能接收什么参数

void test(int* p){
}void test2(char* p){
}
int a =10;test(&a);//或者int a =10;int *p =&a;test(p);//test2同理

二级指针传参

void test(int** ptr){
printf("num= %d\n", **ptr);}int main(){
int n =10; int* p =&n; int **p =&p; test(pp); test(&p); int* arr[10]; test(arr);//指针数组也可以 return 0;}

转载地址:https://blog.csdn.net/xiaotangyu7dong/article/details/116088907 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:入门学习计算机第十六天—指针进阶(二)
下一篇:入门学习计算机第十五天——数据的存储

发表评论

最新留言

不错!
[***.144.177.141]2024年04月19日 09时03分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

农民工看完都会了!Flutter尽然还能有这种操作!终获offer 2019-04-29
安卓开发api!Android面试中常问的MMAP到底是啥东东?附面试题答案 2019-04-29
安卓开发入门视频!你了解过移动端适配吗?复习指南 2019-04-29
安卓开发实战!零基础如何成为高级Android开发,架构师必备技能 2019-04-29
安卓开发实训心得!整理出这份8万字Android性能优化实战解析,持续更新中 2019-04-29
安卓app开发框架!写给即将正在找工作的Android攻城狮,成功入职阿里 2019-04-29
安卓app开发环境搭建!Android最强保活黑科技的最强技术实现,完整PDF 2019-04-29
安卓app软件开发教程!免费Android高级工程师学习资源,值得收藏! 2019-04-29
安卓chrome插件开发!Android架构师教你如何突破瓶颈,跳槽薪资翻倍 2019-04-29
安卓rom开发教程!跟Android初学者分享几点经验,写给正在求职的安卓开发 2019-04-29
原理解析!2021年教你增加拿到BAT等大厂offer几率,offer拿到手软 2019-04-29
原生安卓开发!驱动核心源码详解和Binder超系统学习资源,实战篇 2019-04-29
大牛手把手带你!2021年Android进阶者的新篇章,完整PDF 2019-04-29
太牛了!Android程序员最大的悲哀是什么?面试真题解析 2019-04-29
作为字节跳动面试官,BAT这种大厂履历意味着什么?赶快收藏备战金九银十! 2019-04-29
大牛深入讲解!Android面试中常问的MMAP到底是啥东东?再不刷题就晚了! 2019-04-29
太赞了!你会的还只有初级安卓工程师的技术吗?3面直接拿到offer 2019-04-29
腾讯Android开发面试记录,安卓系列学习进阶视频 2019-04-29
阿里P8架构师的Android大厂面试题总结,醍醐灌顶! 2019-04-29
阿里、腾讯大厂Android面试必问知识点系统梳理,满满干货指导 2019-04-29