指针数组的简单理解

 1 #include <stdio.h>
 2 /*
 3 研究类型,步长,数组名和二级指针的关系
 4 */
 5 int main(void)
 6 {
 7     char *p[4] = {"1234","sq34","d234","4234"};
 8     //万变不离其中:数组名 == 首元素的地址
 9     //1.整体研究
10     printf("sizeof(p) = %d\n",sizeof(p));//p是数组名,作为整体,p返回的是数组的长度。16字节
11     printf("&p = %p\t&p+1 = %p\n",&p,&p+1);//对数组名引用,它的类型发生变化由char ** 变成了char **[4]类型,所以+1是加了16字节
12     printf("sizeof(&p) = %d\tsizeof(char *[4]) = %d\n",sizeof(&p),sizeof(char **[4]));
13     printf("p = %p\tp+1 = %p\n",p,p+1);
14     printf("*p = %s\tsizeof(*p) = %d\n",*p,sizeof(*p));//指针数组里面的每个元素都是个指针,所以每个元素占用4个字节
15     printf("*p = %s\t**p = %c\n",*p,**p);//*p代表字符串的首地址,**p就代表字符串的第一个字符
16     //指针数组名和二级指针是等价的
17     char **q = p;//能这样写的原因:p = &p[0]  而p[0]是个指针,是char *类型,所以 p是 char **类型,是指向指针的指针,是个二级指针
18     printf("*q = %s\n",*q);
19     //2.单独元素研究
20     printf("p[0] = %s,sizeof(p[0]) = %d\n",p[0],sizeof(p[0]));//p[0]代表数组的第一个元素,而第一个元素是一个指向data区ro段的指针。
21     printf("*p[0] = %c\tp[0][0] = %c\n",*p[0],p[0][0]);//p[0]代表第一个元素,而第一个元素是一个字符串(可以理解成一个字符数组)
22                                                        //所以p[0]就是字符串的首地址,*p[0]就代表第一个字符
23     printf("*(p[0]+1) = %c\n",*(p[0]+1));//p[0]代表第一个字符串的首地址,地位相当于一维数组名,所以+1加的是1个字节。下面测试
24     printf("p[0] = %p\tp[0]+1 = %p\n",p[0],p[0]+1);//测试
25     //整体访问
26     for(int i = 0;i<4;i++)
27     {
28         printf("%s\n",p[i]);
29     }
30     //单独访问一个字符串中的元素
31     for(int j = 0;j<sizeof(p[0]);j++)
32     {
33         printf("%c\t",*(p[0]+j));//或者:printf("%c\t",*(*p+j));
34     }
35     putchar(10);
36     /*
37     总结:1.指针数组本质上就是一个数组,只不过这个数组里面放的都是指针而已。
38           2.二级指针和指针数组名是等价的关系。
39     */
40
41     return 0;
42 }

原文地址:https://www.cnblogs.com/wangchaomahan/p/9936845.html

时间: 2024-08-02 01:31:57

指针数组的简单理解的相关文章

C++函数指针数组的简单使用

声明函数指针的数组类似声明一般的指针数组.接上文例子将其改进为使用函数指针的数组,代码如下: #include <iostream> using std::cout; using std::endl; //函数声明 double squared(double); double cubed(double); double sum_array(double array[],int len,double (*pfun) (double)); int main(){ double array[]={1

c语言的函数指针和函数指针数组的简单demo

今天,简单记录一下,函数指针和函数指针数组的使用,废话不多说,直接贴上代码,里面有详细的注释,方便以后查阅. 1 #include <cstdio> 2 #include <Windows.h> 3 4 typedef void(*myFun)(const char*);//这里定义的一个函数类型(返回值为void,参数为const char*),类型名为myFun,使用见第28行 5 6 void(*func)(const char* name); //声明了一个函数指针,指针名

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

函数指针,函数指针数组,函数返回值为函数指针

函数的名字就是函数的首地址:定义函数指针; int (*p)(int ) p为函数指针变量名字,int 为函数的返回值类型为int型:(int)为函数的形参类型为int型, 注:因为优先级所以要用(*p),否则就会p先和后面的()结合为int*p(int),意思就变为p(int)函数的返回值为int* 注:main2()函数中   int (*p[])(int ,int )  为一维数组,下面写错了, #include<stdio.h> #include<stdlib.h> int

C++学习 - 数组指针/指针数组

虽然我一直知道它们两个的区别,但是分不清名字应该是叫哪个. 这里区别一下. 指针数组( array of pointers ) 顾名思义:这是个数组,数组里面的元素都是指针. int *arr[10]; 这个等同于 int *(a[4])因为*的优先级比较低,所以没有括号的时候,是arr和[10]先结合,变成一个数组,然后这个数组的元素是整型指针. 初始化 这个初始化要按照数组的方式来. for ( int i = 0; i < 10; i++){ a[i] = (int *)malloc( 5

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

关于理解指针数组,数组指针,数组名,二维数组的一些技巧。

/*************关于数组名***************/ int a[3] = {1, 2, 3} 1.数组名代表数组第一个元素的地址,注意,不是数组地址(虽然值相等),是数组第一个元素地址,a 等同于 &a[0]; a+1是第二个元素的地址.比第一个元素地址a(或者&a[0])超出了一个整型指针的大小,在这里是4个字节(byte) cout << a << endl;会输出数组第一个元素地址. 2.取址符号&. &a是数组的地址,注意

关于引用和指针的简单理解

指针和引用一直是C++中难懂的部分,为此我也困惑了很久,下面说说我对引用和指针的简单理解. 在使用函数时我们常常会纠结实参传递到形参后,函数对形参的操作会不会改变实参的值(也就是主函数的相应变量),最典型的例子是swap(int a,int b).我们都知道,函数在调用时会给变量重新开辟一个存储空间,而这个存储空间会暂时存储形参的值,如果函数在调用完毕后,其相应存储空间的值会被释放.例如下面一段代码: void swap1(int a, int b) { int temp = 0; temp =

数组指针和指针数组简单了解

这两个看起来很相似,但是却完全不一样.下面先说下数组指针. 数组指针,例如int(*p)[5],定义了一个数组指针,它指向指向包含5个int型元素的一维数组.来个程序看看. 1 #include<stdio.h> 2 int main() 3 { 4 int c[4]={1,2,3,4}; //定义一个整型数组 5 int (*b)[4]; //定义一个指向为int()[5]类型的数组指针 6 b=&c; //将c数组的地址赋给b 7 printf("%d",*(*