转:数组与指针的区别

转自:二维数组和指向指针的指针

一道面试题引发的问题,首先要知道[]的优先级高于*,题目:

char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?

直接用程序说明:

#include<stdio.h>

void main(){    char **p,a[6][8];    p = a;    printf("\n");}

编译,然后就会发现通不过,报错:错误 1 error C2440: “=”: 无法从“char [6][8]”转换为“char **”

于是乎,我看了下《C专家编程》里10.5节—使用指针向函数传递一个多维数组。

方法一,函数是 void fun(int arr[2][3]); 这种方法只能处理2行3列的int型数组。

方法二,可以省略第一维的长度。函数是 void fun(int arr[][3]);这种方式虽然限制宽松了一些,但是还是只能处理每行是3个整数长度的数组。

    或者写成这种形式 void fun(int (*arr)[3]);这是一个数组指针或者叫行指针,arr和*先结合使得arr成为一个指针,这个指针指向具有3个

    int类型数据的数组。

方法三,创建一个一维数组,数组中的元素是指向其他东西的指针,也即二级指针。函数是 int fun(int **arr);这种方法可以动态处理各行各列不一样长度的数据。

注意:只有把二维数组改成一个指向向量的指针数组的前提下才可以这么做!比如下面的程序可以正常输出abc:

#include <iostream> using namespace std; void test(char **ptr) {     cout << *ptr << endl; } 

int main() {     char *p[3] = {"abc", "def", "ghi"};     test(p);     return 0; }

在《C专家编程》10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)

数组和指针参数是如何被编译器修改的?

数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:

实参                                                      所匹配的形参

数组的数组          char c[8][10];                 char (*)[10];          数组指针

指针数组             char *c[10];                   char **c;               指针的指针

数组指针(行指针)  char (*c)[10];                 char (*c)[10];        不改变

指针的指针           char **c;                       char **c;               不改变

下面再看一个网友的一段分析相当给力的代码:

#include "stdafx.h" #include <iostream> using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) {     int arr1[3];     int arr2[3];     int arr3[3];     int * ptr;     // ptr1是一个指向 int [3] 的指针,即ptr的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长     int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}};     // ptr2是一个指向 int * 的指针,即ptr2的类型和&ptr是一样的,注意:ptr指向的内存区域不定长     int * ptr2[3]={arr1,arr2,arr3};     // ptr3是一个指向 int [3] 的指针,即ptr3的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长     int(* ptr3)[3]=&arr1;     ptr3=ptr1; // 没错,他们的类型相同  // ptr3=ptr2;//error 无法从“int *[3]”转换为“int (*)[3]  // ptr4是一个指向 int * 的指针,即ptr4的类型和&ptr是一样的,注意:ptr指向的内存区域不定长     int ** ptr4;     //ptr4=&arr1; //error 无法从“int (*)[3]”转换为“int **     ptr4=ptr2; // 没错,他们的类型相同  //ptr4=ptr3; // error 无法从“int (*)[3]”转换为“int **     return 0; }

时间: 2024-10-05 17:05:50

转:数组与指针的区别的相关文章

数组与指针的区别

数组与指针的区别 1.数组与指针的定义 指针是变量,存储的是一个地址,用来间接访问数据,在32位系统下占用4个字节.指针可以指向任何内存空间,但不是任何内存空间都可以通过指针去访问(不能访问寄存器). 数组是标识符且不占用存储空间,类似于常量,因此数组名不能作为左值. short *sz[4]; //大小为4的一维数组,元素是指针 short (*sz1)[4]; //指向数组的指针 2.extern数组与指针 先看这一段代码: /* * d.c * Created on: * Author:

字符串拼接 strcat ;数组和指针的区别

问题:字符串拼接 strcat 方法1: 开辟新空间,存放结果: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> char* _strcat(char* str1, char* str2){ assert(str1 != NULL && str2 != NULL); char* ret = (char*)malloc((strlen(

数组与指针的区别,以及在STL中传递数组/指针

数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = { 1,2,3,4,5 }; f(a); 上述代码输出的是4(32位系统)或8(64位系统),总之不是sizeof(int) * 5(数组大小). 为什么明明形参是数组形式的int [],实际上和指针形式的int *无异呢?关键原因就在于,数组是不能作为左值的. 也就是说,你不能定义两个数组,比如int a[

(C语言)数组与指针的区别

以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我试着将自己的理解写一些. 首先需要了解数组和指针的工作模式. 数组: char name[] = {'T', 'o', 'n', 'y', '\0'}; 此时,这个数组的地址是这样的.其中name指向数组的开头: 指针: char name[] = {'T', 'o', 'n', 'y', '\0'}; ch

引用和指针的区别,数组和指针的区别

一:引用和指针的区别 1:引用并非对象,它只是为一个已存在的对象所起的另外一个名字,必须初始化,而且无法改变它绑定的对象,之后每次使用这个引用都是访问最初绑定的那个对象. 2:指针本身是对象,可以不用初始化,可以改变指针指向的对象 二:指针与数组的区别 指针 数组 保存数据的地址 保存数据 间接访问数据 直接访问 通常用于动态数据结构 通常用于存储固定数目数据类型相同的元素 相关操作malloc(),free()等 隐式分配和删除 同常指向匿名数据 自身即为数据名 在C语言中对于下面的两种情况,

深入理解数组与指针的区别

在大一刚开始学习C的我们也许并没有真正的理解数组与指针,其实C的精华部分便是指针与内存的分配这一块. 那是充其量我们能够知道数组与指针肯定不是完全等价的,相同点就是:对数组的引用总是转化为对指针的引用,而不同点呢就是数组名是常量而指针是变量仅此而已,随着我们资历不断的提升,我们么更加进一步的去理解它,从他的本质去即内存的分配与访问去理解它. 好了,首先呢我们必须明白一个概念在C语言中,一个变量的声明和定义有什么区别. 我们知道定义只是一个特殊的声明. 定义:只能出现在一个地方,创建新对象,同时确

数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.指针可以随时指向任意类型的内存块.    (1)修改内容上的差别 char a[] = "hello";  //它们有各自的内存空间:a[0] = 'X';char *p = "world"; // 注意p 指向常量字符串p[0] = 'X'; // 编译器不能发现该错误,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数).sizeof(p),p 为指针得到的是一个 指针变量的字节数,

C 中数组和指针的区别

联系: 1,一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现. 2,当数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址. 区别: 1,指针是一个变量,因此,在C语言中,语句pa=a和pa++都是合法的.但数组名不是变量,因此,类似于a=pa和a++形式的语句是非法的. 2,数组名代表定义的一整块内存,sizeof 得到的是整个数组的字节大小,而指针终究是一个变量,sizeof 得到的是该指针占用的字节数.

数组的地址+1 和 指向数组的指针+1 区别

定义了数组a[8],其中a,&a,&a[0]都是数组的起始地址.但是步长有区别,也就是指向的类型不同 a等同于a+0等同于&a[0],是指向数组第一个元素的指针,步长为指向的元素所占用的地址空间为sizeof(int) . &a也是指向数组第一个元素的指针,但其意义是指向整个数组的首地址,指向的类型为整个数组,所以其步长为8*sizeof(int) 而ptr指,针指向的是数组的是首地址,所以*(ptr-1)的值是8 即输出的结果是8 #include <stdio.h