当前位置: 首页 > news >正文

网站提权北京互联网公司排名100强

网站提权,北京互联网公司排名100强,手机网站建设的价格,网站网络推广运营本章主要是补充 指针和数组方面的指示#xff0c;把前面指针的知识补充下。参考前面的C语言基础—指针 C语言指针与数组 进阶用一级指针访问二维数组❗易错点: 不能直接指针变量数组名指向数组的指针1. 指向指针的指针2. 指向一维数组的指针 (*P)[4]—行指针二维数组名指针数组… 本章主要是补充 指针和数组方面的指示把前面指针的知识补充下。参考前面的C语言基础—指针 C语言指针与数组 进阶用一级指针访问二维数组❗易错点: 不能直接指针变量数组名指向数组的指针1. 指向指针的指针2. 指向一维数组的指针 (*P)[4]—行指针二维数组名指针数组❗易错点 区别行指针 (*ps)[10]— *ps[10] — *(ps[10])❗❗指针数组的作用指针数组表示二维数组的举例p[i]a[i]动态申请和释放二维数组动态一维数组实现用指针数组实现- 为什么不用定义int *a[N]?动态分配内存的过程分配内存的图示定义指针数组动态申请指针数组用指针数组处理多个字符串二维字符数组存储多个字符串使用指针数组存储多个字符串下面举几个例子字符串排序 (指针数组)方法一: 二维字符数组方法二使用指针数组处理n个字符串排序(指针数组实现)用一级指针访问二维数组 数组其实是按行排序在内存地址中的所以可以省略行不能省略列。 具体解释见C语言数组——多维数组 利用这一特性可以通过指针偏移遍历数组 比如假设a是一个M行N列的数组M,N列是预定义的常量定义如下: int a[M][N]; int *pa[0][0];下面的语句段可以求出数组a中所有元素的累加和: sum0; for(i0;iM*N;i,p) sump;也可以通过行列号做循环变量使用双重循环来实现 求所有上三角元素的和 for(i0;iM;i)for(ji;jN;j)sum*(pi*Nj); //或者sum *(*(pi)j);❗易错点: 不能直接指针变量数组名 也就是说不能pa[0][0]能写成pa 二维数组名a可以被解释为指向第一行的指针即a和a[0]是等价的。 但是a并不是指向二维数组中第一个元素的指针而是指向二维数组中第一行的指针。 因此将指针p赋值为二维数组a是不正确的因为它们指向的内存地址不同不能直接相互赋值。 也就是说数组名在多维数组中指的是指向第一行的指针. a1代表的是下一行的数据 指向数组的指针 1. 指向指针的指针 类型名 **变量名 比如下面: int i,*pi; int **dp; dpp;dp中存储的是指针变量p的地址我们说,dp指向指针变量pdp是指向指针p)的指针变量 2. 指向一维数组的指针 (*P)[4]—行指针 比如二维数组: int a[3][4] 定义了一个3行4列的二维数组可以看成a[0] a[1] a[2]三个元素组层的一维数组每个元素a[i]都是一个有4个int型元素的值定义一个指针p我们已经知道P1是下一行 如何定义这种已经知道列的二维数组的指针呢? 可以这样写: int (*p)[4]; 声明了p是一个指向数组的指针指向的是int[4]类型 如何让p指向一维数组a[0]? 可以这样写:pa[0]; (*p)[0] 即 a[0][0]的引用(*p)[1] 即 a[0][1]的引用要想下一行p1 比如假设a是一个M行N列的数组M,N列是预定义的常量定义如下: int a[M][N]; int *pa[0];下面的代码可以求元素和: sum0; for(i0;iM;i,p) //p自增将指向下一行for(j0;jN;j)sum(*p)[j]; //p指向数组a[i],(*p)等价于a[i]二维数组名 我们通过上面已经知道 a是指向一维数组a[0]的指针类似这样 *(ai)就是对a[i]的引用 我们知道数组在内存中是按竖着按行排列的 所以 *(ai)j就是 第i行a[i]再j 取得 a[i][j]的地址 也就是说如图: 指针 a[i]1、 *(ai)1指向a[i][1]; *(a[i]1)、*( *(ai)1)是对a[i][1]的引用 举例 用指针访问二维数组 求元素和 #include stdio.hint main() {int i,j,m,n;int sum 0;scanf(%d%d,m,n);int a[m][n];printf(\n);for (int i 0; i m; i) for ( j 0; j n; j)scanf(%d,*(ai)j); //这是指针for (int i 0; i m; i)for ( j 0; j n; j) sum *(*(ai)j); //指针引用取值printf(三角元素的和为%d\n, sum);return 0; }指针数组 指针数组就是数组里面每个都是指针 格式类型名* 数组名[数组长度] 数组元素是指针类型用于存储地址 int a[10]; a是一个数组它有10个元素 每个元素的类型都是整型 char *color[5] color是一个数组它有5个元素 每个元素的类型都是字符指针 ❗易错点 区别行指针 (*ps)[10]— *ps[10] — *(ps[10]) int *ps[10]; 定义了含有10个元素的一维数组ps每个元素都是int指针类型 区别于 int (*ps)[10]这个是一个指向10列的二维数组的一个指针变量. 因为[]的优先级高于*所以int *ps[10];解释为int*(ps[10])这样 ❗❗指针数组的作用 指针数组的主要作用是表示二维数组尤其是字符串数组。 用指针数组表示二维数组的好处是 二维数组的每一行或字符串数组的每个字符串可以具有不同的长度. 在二维数组中每一行可以具有不同的长度但是使用传统的二维数组表示方式每一行的长度都必须相同这给程序的编写带来了一定的限制。而使用指针数组来表示二维数组则可以轻松地实现每一行具有不同长度的效果。例如可以使用指针数组来表示一个3行不等长的二维数组代码如下 int a1[] {1, 2, 3}; int a2[] {4, 5}; int a3[] {6, 7, 8, 9}; int *p[] {a1, a2, a3};在上面的例子中指针数组p中的每个元素都是一个指向int类型的指针每个指针指向一个长度不同的int类型数组即一个二维数组的一行。在上面的例子中第一行有3个元素第二行有2个元素第三行有4个元素。 另外在字符串数组中每个字符串的长度也可以不同使用指针数组来表示字符串数组可以更加灵活地处理不同长度的字符串。 因此使用指针数组来表示二维数组或字符串数组可以具有不同的长度从而更加灵活地处理数据。 指针数组表示二维数组的举例p[i]a[i] 在表示二维数组时指针数组可以被用来代替二维数组。二维数组是一组连续的内存空间元素的地址是连续的。而指针数组则是一组指针每个指针指向一个内存空间这些内存空间不一定是连续的。因此指针数组可以用来表示非连续的二维数组。 例如可以使用指针数组来表示一个3行4列的二维数组代码如下 int a[3][4] {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; int *p[3]; for (int i 0; i 3; i) {p[i] a[i]; }在上面的例子中指针数组p中的每个元素都是一个指向int类型的指针每个指针指向一个长度为4的int类型数组即一个二维数组的一行比如p[0]指向a[0]第一行的。 在循环中通过将指针数组p中的每个元素指向二维数组a的每一行就可以使用指针数组p来表示整个二维数组。 使用指针数组表示二维数组的好处是可以更加灵活地对数组进行操作。例如可以通过修改指针数组中的元素来改变二维数组的大小和形状而不需要创建一个新的二维数组。同时指针数组的内存使用也更加灵活可以根据需要动态分配内存。 动态申请和释放二维数组 输入整数n和n然后输入m行n列的矩阵。然后输出矩阵。要求动态申请和释放二维数组 方法1用动态一维数组的方法存储二维数组方法2用指针数组实现 动态一维数组实现 也就是申请的内存块是一维数组那样的然后一个一个装进去。 代码如下 #include stdio.h #include stdlib.hint main() {int n, m,i,j;scanf(%d %d, n, m);// 动态申请一维数组 m*n个内存块int *p (int *) malloc(n * m * sizeof(int));for (i 0; i m; i){ for (j 0; j n; j)scanf(%d,pi*nj);//scanf(%d,p[i*nj]);}for (i 0; i m; i){ for (j 0; j n; j)printf(%d ,p[i*nj]);//指针也可以作为数组名printf(\n); }return 0; }用指针数组实现 (1) 声明一个一维指针数组存放每行的首地址 int **a; //指向指针数组的首地址 a(int **)malloc(m*sizeof(int*));(2) 用malloc为每一行元素申请空间 for(i0;im;i) a[i](int*)malloc(n*sizeof(int));(3) 读入m*n个元素 (4) 输出矩阵 (5) 释放每一个行指针所指空间 for(i0;im;i) free(a[i]);代码如下 #include stdio.h #include stdlib.h #define N 100int main() {int n, m,i,j;// 读入矩阵的行列数printf(请输入矩阵的行数和列数\n);scanf(%d %d, m, n);// 动态分配指针数组存放每行的首地址int **a(int **)malloc(m * sizeof(int *)); //申请存储m个指针的内存块// 动态分配每一行的空间for (i 0; i m; i) {a[i] (int *)malloc(n * sizeof(int));}// 读入矩阵元素printf(请输入矩阵的元素\n);for (i 0; i m; i) {for (j 0; j n; j) {scanf(%d, a[i][j]);}}// 输出矩阵printf(您输入的矩阵为\n);for (i 0; i m; i) {for (j 0; j n; j) {printf(%d , a[i][j]);}printf(\n);}// 释放每一行的空间for(i0;im;i)free(a[i]);return 0; }下面解释下? - 为什么不用定义int *a[N]? 实际上定义 int *a[N] 可以用来定义一个指针数组每个指针指向一个整型数组。在这个例子中指针数组的长度为 N但是在动态分配内存时使用的是一个 m 倍的空间这可能会导致内存溢出。因此指针数组的定义在这里并不适用。相反需要使用一个指向指针的指针 int **a 来动态分配内存。 动态分配内存的过程 首先通过调用 malloc() 函数来为存储指针的内存块分配空间。为了能够存储 m 个指针需要分配 m * sizeof(int *) 字节的内存。然后通过循环分配每一行的内存空间。每一行需要分配n * sizeof(int)字节的内存。 总结一下a[i] 可以直接使用是因为它在数组 a 中被定义为指向整型数组的指针。在动态分配内存时首先需要为存储指针的内存块分配空间然后循环为每一行分配内存。 也就是系统自动分配了指针数组因为通过分配m * sizeof(int *) 字节的内存相当于知道 a[i]的地址然后再通过n * sizeof(int)分配每一行的列的内容的内存。 分配内存的图示 定义指针数组 动态申请指针数组 用指针数组处理多个字符串 二维字符数组存储多个字符串 char ccolor[][7]{red,blue,yellow,green,purple};一个字符占一位列数取决于最长的字符串 使用指针数组存储多个字符串 char *pcolor[]{red,blue,yellow,green,purple};这时候指针数组里面每个指针指向字符串首地址 优点是更节省内存空间 下面举几个例子 字符串排序 (指针数组) {“red”,“blue”,“yellow”,“green”,“purple”}; 请排序后输出 方法一: 二维字符数组 #include stdio.h #include string.hint main(void) { char colors[][7] {red, blue, yellow, green, purple}; int num_colors sizeof(colors) / sizeof(colors[0]); //行// Sort the colors for (int i 0; i num_colors - 1; i) {for (int j i 1; j num_colors; j) {if (strcmp(colors[i], colors[j]) 0) {char temp[7];strcpy(temp, colors[i]);strcpy(colors[i], colors[j]);strcpy(colors[j], temp);}} }// Print the sorted colors for (int i 0; i num_colors; i) {printf(%s\n, colors[i]); }return 0; }方法二使用指针数组处理 本质是改变指针数组中每个指针的地址改变指向方向 #include stdio.h #include string.hint main(void) { char *colors[] {red, blue, yellow, green, purple}; int num_colors sizeof(colors) / sizeof(colors[0]);// Sort the colors for (int i 0; i num_colors - 1; i) {for (int j i 1; j num_colors; j) {if (strcmp(colors[i], colors[j]) 0) {char *temp;temp colors[i];colors[i] colors[j];colors[j] temp;}} }// Print the sorted colors for (int i 0; i num_colors; i) {printf(%s\n, colors[i]); }return 0; }n个字符串排序(指针数组实现) 输入n和n个字符串(每个字符串不超过80个字符)请排序后输出要求使用指针数组(而不是二维字符数组)处理 可以使用指针数组和动态内存分配来实现具体思路如下 首先读入字符串的个数 n使用 malloc 函数动态分配一个指针数组 strArr大小为 n然后使用 fgets 函数逐个读入字符串将每个字符串的地址存储到指针数组中对指针数组中的字符串进行排序可以使用 qsort 函数最后遍历指针数组按照顺序输出每个字符串。 #include stdio.h #include stdlib.h #include string.h#define MAX_LENGTH 80int cmp(const void *a, const void *b) {return strcmp(*(char **)a, *(char **)b); }int main() {int n;printf(请输入字符串的个数);scanf(%d, n);// 动态分配指针数组char **strArr (char **)malloc(n * sizeof(char *));if (strArr NULL) {printf(动态分配内存失败\n);exit(1);}// 逐个读入字符串for (int i 0; i n; i) {strArr[i] (char *)malloc((MAX_LENGTH 1) * sizeof(char));if (strArr[i] NULL) {printf(动态分配内存失败\n);exit(1);}printf(请输入第%d个字符串, i 1);getchar(); // 去掉回车fgets(strArr[i], MAX_LENGTH 1, stdin);// 如果字符串最后一个字符是 \n将其替换为 \0int len strlen(strArr[i]);if (strArr[i][len - 1] \n) {strArr[i][len - 1] \0;}}// 排序指针数组qsort(strArr, n, sizeof(char *), cmp);// 输出排序后的字符串for (int i 0; i n; i) { printf(%s\n, strArr[i]); }// 释放动态分配的内存 for (int i 0; i n; i) {free(strArr[i]); } free(strArr);return 0; }解释下: cmp 函数是一个用于比较两个字符串指针的函数它的作用是在使用 qsort 函数对指针数组进行排序时指定排序的规则。 qsort 函数的原型为 void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *));其中compar 参数是一个指向比较函数的指针 它接受两个指针参数分别指向数组中需要比较的两个元素。比较函数应该返回一个整数值表示两个元素的大小关系。 在本例中cmp 函数的作用是比较两个字符串指针所指向的字符串返回它们的大小关系。具体地cmp 函数的参数类型为 const void *也就是指向任意类型的指针。我们需要将它们转换为指向 char * 类型的指针然后再进行字符串比较。 为了实现这个目的我们首先将 a 和 b 转换为指向 char ** 类型的指针。然后使用 * 运算符来取出指针所指向的字符串再使用 strcmp 函数进行比较。 因此cmp 函数的实现如下 int cmp(const void *a, const void *b) {return strcmp(*(char **)a, *(char **)b); }这样在调用 qsort 函数时我们可以将 cmp 函数的地址作为参数传递qsort 函数会根据 cmp 函数的返回值来排序指针数组中的元素。
http://www.w-s-a.com/news/742985/

相关文章:

  • 手机搭建网站工具网站搜索引擎优化的基本内容
  • 网站快速排名二手交易网站开发技术路线
  • 官方网站开发公司施工企业会计王玉红课后答案
  • 网站建设能用手机制作吗网站建设所需物资
  • 阜阳做网站的公司阳江招聘网最新消息
  • 织梦可以做哪些类型型网站wordpress 融资
  • 建设银行手机银行官方网站下载安装腾讯企点账户中心
  • 品牌设计网站有哪些商务网站建设平台
  • 新增网站备案时间什么是软件外包产业
  • 张家界做网站买了网站模版怎么做
  • 六安品牌网站建设怎么样知名商城网站建设报价
  • 怎么上传自己做的网站杭州网站建设公司平台
  • 网站开发程序是什么知名的电子商务网站
  • 做pc端网站好么平台推广是什么意思
  • 农业信息网站建设意义淘宝官网首页网址
  • 重庆网站设计公司价格贵阳网站建设app开发
  • dw做网站怎么换图片编写网页所用的语言是
  • 外贸网站收录工具个人网站的备案
  • 正规的网站建设工作室海外高延迟服务器做网站
  • 网站设计确认函合肥做网站维护的公司
  • 小说网站推荐网站开发语言怎么查
  • 网页制作基础教程慕课版电子版那种登录才能查看的网站怎么做优化
  • 制作网站用的域名网站域名注册信息查询
  • 公司域名查询官方网站女教师遭网课入侵直播录屏曝
  • 网站开发社交网络功能的作用腾讯公司网站
  • 网站建设需要微信账号和密码网站建设工作汇报
  • 国家城乡住房和建设部网站西安私人网站
  • 天津高端网站定制seo实战教程
  • 网站文章怎么做才能被快速收录网站备案核验系统
  • 子网站建设方案l建设银行网站