C语言 指针数组-字符指针数组整型指针数组 char*s[3] int*a[5] 数组指针int(*p)[4]

基本介绍

1.指针数组:由n个指向整型元素的指针而组成,里面存放指针
Int *ptr[3];

2.地址:
ptr[i]:元素地址
&ptr[i]:指针地址

图示

代码:
在这里插入图片描述
内存布局:
在这里插入图片描述

代码

#include<stdio.h>
#include<string.h>
//指针数组--int
void pointer(int *arr,int len)
{int i, *ptr[10];for(i=0;i<len;i++){ptr[i]=&arr[i];printf("arr[%d]=%d address=%p\n",i,arr[i],&arr[i]);printf("ptr[%d]=%d address=%p self-address=%p\n",i,*ptr[i],ptr[i],&ptr[i]);}
}//指针数组--char
void cpointer(char* s,int len)
{char *c[4];int i=0;printf("s=%s address=%p self-address=%p\n",s,s,&s);while(i<len){c[i]=&s[i];printf("c[%d]=%c address=%p self-address=%p\n",i,*c[i],c[i],&c[i]);i++;}
}void cpointer2(char *s,int len)
{char *c[4];int i;printf("s=%s address=%p self-address=%p\n",s,s,&s);for(i=0;i<len;i++){c[i]=&s[i];}char *p=c[0];for(i=0;i<len;i++){printf("c[%d]=%c address=%p self-address=%p\n",i,*p,p,&p);p++;}
}
int main()
{int i,arr[10];int len=sizeof(arr)/sizeof(int);char *s="uiop";for(i=0;i<len;i++){arr[i]=99;}printf("int_pointer:\n");pointer(arr,len);printf("char_pointer:\n");cpointer(s,strlen(s));printf("char_pointer2:\n");cpointer2(s,strlen(s));getchar();return 0;
}

输出:

int_pointer:
arr[0]=99 address=010FF984
ptr[0]=99 address=010FF984 self-address=010FF854
arr[1]=99 address=010FF988
ptr[1]=99 address=010FF988 self-address=010FF858
arr[2]=99 address=010FF98C
ptr[2]=99 address=010FF98C self-address=010FF85C
arr[3]=99 address=010FF990
ptr[3]=99 address=010FF990 self-address=010FF860
arr[4]=99 address=010FF994
ptr[4]=99 address=010FF994 self-address=010FF864
arr[5]=99 address=010FF998
ptr[5]=99 address=010FF998 self-address=010FF868
arr[6]=99 address=010FF99C
ptr[6]=99 address=010FF99C self-address=010FF86C
arr[7]=99 address=010FF9A0
ptr[7]=99 address=010FF9A0 self-address=010FF870
arr[8]=99 address=010FF9A4
ptr[8]=99 address=010FF9A4 self-address=010FF874
arr[9]=99 address=010FF9A8
ptr[9]=99 address=010FF9A8 self-address=010FF878
char_pointer:
s=uiop address=006B5814 self-address=010FF894
c[0]=u address=006B5814 self-address=010FF878
c[1]=i address=006B5815 self-address=010FF87C
c[2]=o address=006B5816 self-address=010FF880
c[3]=p address=006B5817 self-address=010FF884
char_pointer2:
s=uiop address=006B5814 self-address=010FF894
c[0]=u address=006B5814 self-address=010FF860
c[1]=i address=006B5815 self-address=010FF860
c[2]=o address=006B5816 self-address=010FF860
c[3]=p address=006B5817 self-address=010FF860

字符数组指针

具体分析

#include<stdio.h>
#include<string.h>
int main()
{char *p[]={"水浒传","三国演义","西游记","红楼梦"};int i=0;printf("方法1:\n");for(i=0;i<4;i++){/*字符指针char *pstr="good dog ww";printf("字符指针指向的字符串内容:%s\n",pstr);所以这里的%s-->p[i]数组:地址传递(指针)%c *pstr是取出一个字符这里不能*p[i],p[i]本身就是一个字符数组指针,无法单独取出一个字符*/
//p[0]="水浒传" %s p[0]就直接是取出字符串printf("p[%d]=%s address=%p self-address=%p\n",i,p[i],p[i],&p[i]);}printf("方法2:\n");char *ptr=p[0];i=0;while(i<=3){printf("p=%s address=%p self-address=%p\n",ptr,ptr,&ptr);i++;ptr=p[i];//每一个p[i]的字符内容不同,导致其间隔不同,所以不能使用ptr++}getchar();return 0;
}

整型数组指针

#include<stdio.h>
#include<string.h>
//整型指针
int main()
{int a=1,b=2,c=4,d=90;int*a1=&a,*a2=&b,*a3=&c,*a4=&d;int *arr[]={a1,a2,a3,a4};int i;printf("方法1:\n");for(i=0;i<4;i++){//arr[0]=a1=&a=1的地址--%d arr[i]只会取到地址//*arr[i]才能取到值printf("arr[%d]=%d address=%p self-address=%p\n",i,*arr[i],arr[i],&arr[i]);}printf("方法2:\n");i=0;int *p=arr[0];while(i<=3){printf("arr[%d]=%d address=%p self-address=%p\n",i,*p,p,&p);i++;p=arr[i];//p++不行 随机存储的,+1不是下一个元素的地址}getchar();return 0;
}

区分

指针数组:
由n个指向整型元素的指针而组成,里面存放指针
Int *ptr[3];

数组指针:
指向一个有n个元素的数组的指针,里面存放的是整型变量(int类型长度为n的数组的首地址),存的是一个数组地址,而不是单个元素
int(*p)[n]
代码详解

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//指针使用 int(*p)[n]与int *p[n]的区别
int main()
{int i;// int(*p)[n]--指向一个有n个元素的数组的指针,里面存放的是整型变量(int类型长度为n的数组的首地址)//存的是一个数组地址,而不是单个元素int a[3]={1,2,3};int b[3][3]={{1,4,0},{2,5,6},{7,6,8}};int(*arr)[3]=b;printf("int(*arr)[n]:\n");for(i=0;i<3;i++){printf("arr[%d]=%d address=%p self-address=%p\n",i,*arr[i],arr[i],&arr[i]);}//int *p[n]--指针数组,由n个指向整型元素的指针而组成,里面存放指针int *p[3];for(i=0;i<3;i++){p[i]=&a[i];}printf("int*p[n]:\n");for(i=0;i<3;i++){//数组printf("arr[%d]=%d address=%p self-address=%p\n",i,*p[i],p[i],&p[i]);}getchar();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uninitialized_copy测试代码示例

原测试代码如下&#xff1a; int main() {vector<int>v1{1,3,5,7,9,2,4,6,8};allocator<int>alloc;auto data alloc.allocate(9);uninitialized_copy(v1.begin(),v1.end(), data);auto end data 9;while(data!end) {cout << *data <<" "…

C语言的地址 内存

取地址在CPU的寄存器产生&#xff0c;不占据内存地址由计算器总线&#xff0c;地址作为常量不消耗内存指针 存储不同的地址&#xff0c;间接赋值空类型指针 void* 类型指针 不可以取数据 或者修改数据 需要进行强制类型转换int num 10;void *p &num;std::cout << …

C语言 多重指针--整型字符字符串 int**pp

介绍 多重指针:一个指针指向另一个指针 离值越近的指针级别越大:一级 内存布局 代码 图示: 多重指针–整型 #include<stdio.h> #include<string.h> //多重指针--整型//二级指针 void two() {printf("二级指针:\n");int a896;int *p&a,**pp&…

C++ primer 第13章 拷贝控制

文章目录前言拷贝、赋值与销毁拷贝构造函数合成拷贝构造函数拷贝初始化和直接初始化拷贝初始化的发生&#xff1a;参数和返回值拷贝初始化的限制拷贝赋值运算符重载赋值运算符合成拷贝赋值运算符析构函数析构函数完成的工作什么时候会调用析构函数合成析构函数代码片段调用几次…

牛客网C++面经 C++11

请问C11有哪些新特性&#xff1f; auto关键字&#xff1a;编译器可以根据初始值自动推导出类型。但是不能用于函数传参以及数组类型的推导nullptr关键字&#xff1a;nullptr是一种特殊类型的字面值&#xff0c;它可以被转换成任意其它的指针类型&#xff1b;而NULL一般被宏定义…

C语言 返回指针的函数--指针函数 int* max(int a)

定义 strlong示例代码 代码1: #include<stdio.h> #include<string.h> //返回指针的函数//比较两个字符串,返回更长的字符串 char *strlong(char* a,char* b) {char *p1&a[0];char *p2&b[0];while(true){if(*p1\0){return b;}else if(*p2\0){return a;}p1…

第2、3讲 图像的存储格式

本图像处理系列笔记是基于B站杨淑莹老师的课程进行学习整理的。 文章目录黑白图像8位灰度索引图像8位伪彩色索引图像24位真彩色图像图像文件格式BMP文件存储格式BMP文件头位图信息头颜色表位图信息——BITMAPINFO结构BMP位图文件汇总按照颜色深度分类&#xff0c;常用图像文件&…

Ubuntu18.04.4 环境下对属性加密算法CP-ABE环境搭建

注意事项 cpabe依赖pbc&#xff0c;pbc依赖gmp&#xff0c;gmp依赖M4、bison、flex如果权限不够 &#xff0c;命令的前面加上sudo &#xff0c;不要直接使用root用户进行操作&#xff0c;其带来的隐患有很多 第一步 配置简单的环境 简单环境 包括gcc、g、make、cmake、openss…

C语言 函数指针 int(*ptr)(int,int)

基本介绍 函数指针:指向函数的指针 与数组类似 定义 Int(*pmax)(int ,int)max; Int(*pmax)(int x,int y)max;//形参名称不重要 函数返回类型(*指针)(形参类型)函数名称; 具体案例 代码: *pmax取到函数本身 调用函数指针方式: (*pmax)(x,y); pmax(x,y);//与java中调用函数一…

C++ primer 第14章 操作重载与类型转换

文章目录基本概念直接调用一个重载的运算符函数某些运算符不应该被重载使用与内置类型一致的含义选择作为成员或者非成员输入和输出运算符重载输出运算符<<输出运算符尽量减少格式化操作输入输出运算符必须是非成员函数重载输入运算符>>算术和关系运算符相等运算符…

C语言 回调函数 produce(arr,len,getRand)

基本介绍 回调函数:形参中包含另一个函数的函数指针 用函数指针接收另一个函数 案例 代码解析 具体代码 #include<stdio.h> #include<stdlib.h> //回调函数--//函数原型 int getRand(); int *produce(int*arr,int len,int(*get)()); int main() {int arr[10…

从零开始配置服务器密码机的开发环境

开发环境环境配置安装gcc编译器安装g编译器安装make安装cmake安装ssh安装git和配置安装大文件管理工具git-lfs安装数据库sqlite3安装数据库sqlite_orm文件安装Openssl安装Tcl和Tk安装tcl-expect-dev安装boost安装clang-format安装Clion注意事项安装automake和libudev-dev环境配…

C语言 动态内存分配机制(堆区) int*p=malloc(5*sizeof(4))

C程序内存分配图 栈区:局部变量 堆区:动态分配的数据 静态存储区/全局区:全局变量,静态数据 代码区:代码,指令 内存分配说明 内存动态分配的相关函数 堆区: #inlcude<stdlib.h> Malloc(size);//分配长度为size个字节的连续空间 Calloc(n,size);//分配size个长度为n…

C++ primer 第15章 面向对象程序设计

文章目录前言OOP&#xff1a;概述继承动态绑定定义基类和派生类定义基类成员函数与继承访问控制与继承定义派生类派生类中的虚函数派生类对象及派生类向基类的类型转换派生类构造函数派生类使用基类的成员继承与静态成员派生类的声明被用作基类的类防止继承的发生类型转换与继承…

服务器密码机部分文件的介绍学习

相关文件包 automake,autoconf使用详解

C语言 结构体 struct Cat cat1;

引入 使用传统技术解决 需要定义多个变量或数组 结构体与结构体变量的关系示意图 类似Java类中的对象(结构体)与属性(结构体变量) 一切物体都可以看作对象(结构体) 补充:C语言数据类型 简单使用案例 代码 Cat是我们自己定义的数据类型 struct Cat cat1;//创建struct Cat的…

boost Filesystem Library Version 3关于文件的一些函数封装 fsync()函数

boost boost Filesystem Library Version 3boost::filesystem使用方法,根据路径创建文件夹使用boost.filesystem检查文件是否存在的正确方式std::filesystem::temp_directory_path关于C#:与boost :: filesystem :: unique_path()等效的C 17是什么?C++ 檔案、資料夾、路徑處理…

c++面向对象高级编程 总目录

本文是对学习侯捷视频 c面向对象高级编程系列博客的目录总索引。 c面向对象高级编程 学习一 不带指针的类&#xff1a; 访问私有成员变量的方式&#xff0c;内联inline&#xff0c;常量成员函数&#xff0c;构造函数&#xff0c;值传递&#xff0c;引用传递&#xff0c;操作符…

C语言 共用体/联合体 union

引入 传统技术的缺陷—结构体 共用体基本介绍 共用体与结构体一样都是值传递 定义共用体的三种方式 内存布局 共用体数据空间占用最大的成员的数据空间大小 案例解析 1) 2) 3) 4) 注: 1010 1101 0101 0100所对应的十进制是负数 计算机中的二进制都是以补码存储的,所…

C++ Makefile文件详解

什么是Makefile文件 一个工程&#xff0c;源文件不计其数&#xff0c;按照类型、功能、模块分别放在对应的若干个目录中Makefile定义了一系列的规则&#xff0c;比如定义文件编译的先后顺序。类似shell脚本&#xff0c;也可以执行操作系统的命令Makefile带来的好处是自动化编译…