指针与一维数组和二维数组以及字符串指针数组的学习笔记

洋葱洋葱 洋葱洋葱     2022-08-31     405

关键词:

废话不多少,直接上代码,关键的东西已经注释了,看注释信息理解即可。

说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并没有列出,如果需要,

请自行加入printf调试即可。

转贴请注明出处,欢迎和我讨论,谢谢。

               ----------cofin_add

 

#include <stdio.h>

void fun(int m, char *((*p)[m]))
{
  int i = 0;
  char ** buf = (char **)p;
  for(i=0;i<m;i++)
  {
    printf("%s\t", *(buf+i));
  }
  printf("\n");
}

void fun1(int m, char **buf)
{
  int i = 0;
  for(i=0;i<m;i++)
  {
    printf("%s\t", *(buf+i));
  }
  printf("\n");
}

int main(void)
{
  char *buf[] = {"aa", "bb", "cc", "dd", "ee", "ff"}; //指针数组,其中的每一个变量(指针),指向第一个字符串的首地址。
  char **pa = buf; //如何指向数组中的元素呢,因为其中的每一个元素都是指针,所以应该用二重指针指向它。
  char **px = &buf[0]; //数组名就是数组元素的首地址,可以看到和上面是一样的。
  char *(*pb)[6] = &buf; //如何指向指针数组本身?因为数组其中共有六个变量(有6个指针或者指针变量(地址)),故应该用数组指针来指向它,
  //但是由于其中的变量是指针,所以应该在加一个*,纯属个人猜测,如果这个成立的话,也可以解释上面的为什么是用二重指针了,因为buf和&buf[0]等价
  //也就是说,其实&buf[0] 是地址的地址(因为buf[0]本身存储的就是地址),应该用二重指针指向。

  //一维数组再研究
  int a[5] = {0}; //定义数组,有5个int型的变量
  int *p1 = a; //定义指针指向数组中的元素
  int (*p2)[5] = &a; //若是要指向这个数组本身,则需要用数组指针指向它,注意要加括号,[]比*优先级高。

  //二维数组的指针研究
  int aa[2][5] = {0};
  int (*p3)[5] = aa; //指向二维数组中的元素,二维数组中的元素就是一维数组,参考指向一维数组的方法即可
  int (*p4)[5] = &aa[0]; //和上面一样,数组的名字就是数组的首元素的地址,其实是一个地址,也就是一维数组的数组地址。
  int *p5 = &aa[0][0]; //指向二维数组首元素(一维)的首地址,用int *p,类型刚好匹配
  int (*p6)[2][5] = &aa; //指向二维数组本身的指针。总结:把定义中的数组名字换成指针,加()即可。

  char *p = buf[1]; //buf[0] => 里面存的指针数组中的是第一个元素的地址,也就是直接把一个地址给他初始化

  printf("buf[1] = 0x%x.\n", buf[1]);

  printf("sizeof(buf[1]) = %d.\n", sizeof(buf[1]));
  printf("buf[1] = 0x%x.\n", buf[1]);
  printf("sizeof(buf) = %d.\n", sizeof(buf));

  fun(sizeof(buf)/sizeof(buf[0]), &buf); //这里传的是数组指针的地址,类型推倒:原来是一个指针数组,char *pt[x],如果是
  //普通数组的话,char a[x],若指向该数组本身则应该写作 char (*p)[x] = &a; 根据这一点,类比到指针数组也就是 :char *(*p)[x] = &pt;

  fun1(sizeof(buf)/sizeof(buf[0]), buf); //同理
  return 0;
}

 运行结果:

 

将二维指针数组中的字符串分配给一维指针数组

】将二维指针数组中的字符串分配给一维指针数组【英文标题】:Assigningastringfroma2-Dpointerarraytoa1-DPointerArray【发布时间】:2016-02-2022:29:02【问题描述】:目前,我只需要使用数组和指针来执行此操作(因此不需要结构或数据结构... 查看详情

详解c语言指针(代码片段)

文章目录1.字符指针2.指针数组3.数组指针3.1数组指针的定义3.2&数组名和数组名的区别3.3数组指针的使用4.数组参数,指针参数4.1一维数组传参4.2二维数组传参4.3一级指针传参4.4二级指针传参5.函数指针6.函数指针数组7.指向... 查看详情

多维数组与指针(代码片段)

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素,但在概念和使用上,多维数组的指针比一维数组的指针要复杂一些。可以认为二维数组是数组的数组。例:定义:inta[3][4]=1,2,3,4,5,6,7,8,9,10,11... 查看详情

go语言学习--指针数组和数组指针

数组指针(也称行指针)定义int(*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,... 查看详情

二维数组和指针

二维数组和指针⑴用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体... 查看详情

一维数组和一级指针浅析

...,这个名字成为数组  其实我们可以把数组看成是一个字符串,就像是C++中的stri 查看详情

数组参数和指针参数

...方式传递参数2.当向函数传递数组时,将数组名看做常量指针传数组首元素地址3.二维数组参数同样存在退化的问题,二维数组可以看做是一维数组,二维数组中的每个元素是一维数组4.二维数组参数中第一维的参数可以省略5.C语... 查看详情

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变訪问数组的方式

??打印数组中的每一个元素,打印每一个元素的地址:#include<stdio.h>#include<stdlib.h> voidmain(void){   inta[10]={1,2,3,4,5,6,7,8,9,10};   for(int*p=a;p<a+10;p++) //指针类型决 查看详情

c语言指针指向一维数组与二维数组?

请问高人,想定义一个指针指向一个一维/二维数组,(一)double*a;doubledata[3]=1,2,3;a=data;编译正确(二)double*a;doubledata[3][3]=1,2,3,4,5,6,7,8,9;a=data;编译出错:error#515:avalueoftype"double(*)[3]"cannotbeassignedtoanentityoftype"double*"... 查看详情

educoder编程练习题解(文件)

...嵌套函数    一维数组和二维数组    字符数组    指针一    指针二    结构体    文件文件编辑与调试    顺序结构    选择结构一    选择结构二    循环一    循环二    函数递归与嵌套函数    一... 查看详情

二维数组数组指针以及指针数组

 1.二维数组定义  格式:数据类型数组名[行][列];  示例:intbuff[3][5];  第一个[3]表示二维数组buff中有3个一位数组  第二个[5]表示每个一维数组中有5个成员。  若二维数组定义时进行初始... 查看详情

二维数据和一维指针数组(代码片段)

1.二维数组名a的含义:定义一个二维数组a:  inta[3][4]=1,3,5,7,9,11,13,15,17,19,21,23;  a数组包含3个行元素,a[0],a[1],a[2]。      每个行元素a[i]又是一个一维数组,它包含4个元素。a==&a[0]a+i==&a[i]a[0]==& 查看详情

c语言篇+指针进阶练习+qsort模拟实现(回调函数思想)+指针和数组笔试题(代码片段)

...录前言冒泡排序了解qsortc语言库qsort的使用qsort模拟实现指针和数组笔试题解析一维数组字符数组二维数组总结:数组名的意义前言qsort(quicksort)根据你给的比较函数给一个数组快速排序,是通过指针移动实现排... 查看详情

碎碎念(代码片段)

目录1.typedef定义数组类型2.指针数组3.数组指针4.二维数组5.二维数组是线性存储的(用一维数组方式打印)6.一维(二维)数组与数组指针7.二维数组做函数参数8.sizeof测试一维数组、二维数组1.typedef定义数组类型有typedef是类型,没... 查看详情

数组指针和指针数组的区别

数组指针(也称行指针)定义int(*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,... 查看详情

指针中容易混淆的概念以及常见笔试题(代码片段)

C语言指针文章目录C语言指针1.字符串指针2.指针数组3.数组指针4.数组参数,指针参数5.函数指针-指向函数的指针6.函数指针数组7.库函数qsort的用法:qsort(void*p,intnum1,intnum2,int(*cmp)(counstvoid*e1,counstvoid*e2))8.指针和数组练习题1.字符串指... 查看详情

指针与二维数组

二维数组的本质:intmatrix[3][4];intmatrix[3][4];  ==>int[4]matrix[3];    令type为int[4];  typeint[3];说明matrix是一个数组,有3个元素;每一个元素是int[4]类型的;实质上int[4]就是一个拥有4个int元素的一维数组。事实上,... 查看详情

深入理解c指针经典笔试题——指针和数组(代码片段)

...专栏:【C语言】进阶部分🔹本文概括:一些指针和数组笔试题的解析 。🔹本文作者:花香碟自来_ 🔹发布时间:2023.3.12目录一、指针和数组练习题1.一维数组2.字符数组3.二维数组二、指针笔试题1.... 查看详情