指针数组以及数组指针

首先用几个表达式直观的感受一下什么是指针数组以及数组指针。

    一.表达式

    int *p[10];//指针数组
    int (*p)[10]//数组指针

有了直观的感受那么我们具体分析,指针数组以及数组指针是怎么定义的。

      1).指针数组:实质是数组,数组中存放的元素是指针。

      2).数组指针:实质是指针,指针变量中存放的是数组首元素的地址。

    二.分析小程序理解数组指针

    int main()
    {
    	char a[5] = { ‘A‘, ‘B‘, ‘C‘, ‘D‘ };
    	char(*p3)[4] = &a;
    	char(*p4)[5] = a;
    	system("pause");
    	return 0;
    }

1).编译上述程序

(1).第一个警告告诉我们char (*)[4]和char (*)[5]的数组下标不同,只需要将‘4’改成‘5’即可。

       (2).第二个警告告诉我们char (*)[5]与char *的间接级别不同。为什么呢?原因为,字符数组char a[5]的类型的类型是char *,指针指向字符。而char (*p4)[5]的类型是char (*)[5],指针指向数组。

       (3).如果要输出(p3+1)的地址呢?会是什么呢?同样我们用代码来分析。

    
        #include<stdio.h>
        
        int main()
        {
        	char a[5] = { ‘A‘, ‘B‘,‘C‘,‘D‘ };
        	char(*p3)[5] = &a;
        	//char(*p4)[5] = a;//char(*)[5]和char*的间接级别不同
        	int size = sizeof(a) / sizeof(a[0]);
        	int i = 0;
        	for (i = 0; i < 6; i++)
        	{
        		printf("%p\n", &a[i]);
        	}
        	printf("++++++%d", size);
        	printf("-------%p\n", p3+1);
        	system("pause");
        	return 0;
        }

为了分析我将字符数组的地址也都输出了。并且多输出一块空间以便于分析。我们不难发现(p3+1)的地址是向后整整偏移了一个字符数组的大小,那么我们也就可以理解,数组指针的含义了。

    注意:字符数组后面也是有‘\0‘的!!!不单单是字符串。这一点我们可以用sizeof求数组大小,同时在使用memcpy内存拷贝函数的时候尤为重要。你们肯定会有疑问,内存拷贝函数是以(size_t count)作为拷贝条件,为什么还要有拷入‘\0‘?原因很简单,如果不将‘\0’拷入的话,结果还是字符串么?能不能正确使用strlrn函数?所以,这就是为什么要将‘\0’拷入的原因了。很重要!

    三.自测小程序

#include <stdio.h>

int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int *ptr1 = (int *)(&a + 1);//4
	int *ptr2 = (int *)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);//*(ptr1+(-1))
	system("pause");
	return 0;
}

输出的是什么?


以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。

时间: 2024-10-17 13:09:55

指针数组以及数组指针的相关文章

golang 数据一 &nbsp; (字符串、数组和数组指针)

从如下几个方面介绍GO语言的数据 1. 字符串 2. 数组 3. 切片 4. 字典 5. 结构 字符串 Go语言中的字符串是由一组不可变的字节(byte)序列组成从源码文件中看出其本身是一个复合结构 string.go  type stringStruct struct {     str unsafe.Pointer         len int } 字符串中的每个字节都是以UTF-8编码存储的Unicode字符字符串的头部指针指向字节数组的开始但是没有NULL或'\0'结尾标志. 表示方式

数组指针、指针数组、函数指针、指针函数 -----笔记

1.数组的四种访问方式 定义数组 a[]; 指针 *p 指向数组a; (1) 利用数组的下表进行访问 a[i]; (2) 数组名+地址的偏移量i *(a+i) (3) 利用指针 p 进行下表访问 p[i] (4) 指针p + 地址的偏移量i *(p+i) 一维数组数组名:相当于一个单指针 2. 数组指针(指针)     指针数组(数组) 函数指针(指针)     指针函数(函数)    -------->只看后边两个字就能够区分是指针还是数组或函数 _______________________

C/C++笔试篇-------二维指针数组、数组指针的用法

1.废话不多说,先上代码: #include <iostream> using namespace std; int main(void) { int v[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; int (*a)[5] = v; //指针数组,指针指向数组 a[5],a[5]里面是int数值 该指针等于v的地址 cout<<(*a+1)<<endl; //*a是v[0][0]的地址. 0x22fe04 cout<<(*a+2)

C++指针数组和数组指针

指针相关问题 using namespace std; int main(){ //a) 一个整型数( An integer) int a; //b) 一个指向整型数的指针( A pointer to an integer) int *b; //c) 一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an integer) int **c; //d) 一个有 10 个整型数的数组( An array of 10 integers) int

指针数组和数组指针

指针数组:首先它是一个数组,数组的元素都是指针.它是“储存指针的数组”的简称.int *p1[10];数组指针:首先它是一个指针,它指向一个数组.它是“指向数组的指针”的简称.   int (*p2)[10]; 这里需要明白一个符号之间的优先级问题,关键在于p1.p2先和谁结合.“[]”的优先级比“*”要高.p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,int *修饰的是数组的内容,即数组的每个元素.那现在我们清楚,这是一个数组,其包含 10 个指向 int 类型数据的指针,即指针

字符指针与字符数组

学了挺久的c语言,c语言有意思的就有指针这一大块,另外就是字符串,字符指针与字符数组的区别对于初学者应该是比较难以区分的,讲讲自己的看法. 1.定义上的区别 字符数组具有固定的地址,且字符数组的名字不能更改或运算. 字符指针是一个变量,用来存储首字符的地址,且指向的字符串通常为一个常量. char str[] = "helloworld"; str[4] = 'X'; printf("%s",str); 输出结果:hellXworld char *str = &qu

再谈指针数组与数组指针

经常遇到这两个概念,很容易混淆,这里细细总结一下. 指针数组:是一个数组,数组的元素是指针.数组占多少个字节由数组本身决定. 数组指针:是一个指针,它指向一个数组.在32位系统下永远是占4 个字节. 举例说明: 1)int *p1[n]; 2)int (*p2)[n]; 1)"[]"的优先级比"*"要高.p1 先与"[]"结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素.即p1是指针数组,其包含n个指向int

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

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

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

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

数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的长度. 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组. p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;       //该语句执行过后,也就是p=p+