美文网首页
C 数组与指针

C 数组与指针

作者: 面试小集 | 来源:发表于2017-10-08 00:40 被阅读22次

指针

例子1:

int a = 5;
int *p = &a;
std::cout << "a = " << a << "\n";
std::cout << "&a = " << &a << "\n";
std::cout << "p = " << p << "\n";
std::cout << "&p= " << &p << "\n";
std::cout << "*p= " << *p << "\n";

/*
//输出
a = 5
&a = 0x7fff5fbff63c
p = 0x7fff5fbff63c
&p= 0x7fff5fbff630
*p= 5
*/

//以下两句会报错
//Cannot take the address of an rvalue of type 'int *'
std::cout << "&&a = " << &(&a) << "\n";
std::cout << "&&p= " << &(&p) << "\n";

从例子1中可以看出:

    1. 指针是一个变量,其值为另一个变量的地址,即:内存位置的直接地址。
        2. p是一个指针变量,其值是变量a的地址。
        3. &是取地址符。
        4. \* 取回指针变量所指定地址的变量的值。

指针与一维数组

例子2:

int a[3] = {1, 2, 3}; 

std::cout << "a = " << a << "\n";
std::cout << "&a[0] = " << &a[0] << "\n";
std::cout << "a[0] = " << a[0] << "\n";
std::cout << "*a = " << *a << "\n";
/*
//输出
a   = 0x7fff5fbff62c
&a[0]   = 0x7fff5fbff62c
a[0] = 1
*a = 1
*/

int *p = a;
std::cout << "p = " << p << "\n";
std::cout << "*p = " << *p << "\n";
std::cout << "*(p+1) = " << *(p+1) << "\n";
std::cout << "*(p+2) = " << *(p+2) << "\n";

/*
//输出
p = 0x7fff5fbff62c
*p = 1
*(p+1) = 2
*(p+2) = 3
*/

从上面代码可以看出:

  1. 一维数组的变量名的值是该数组第一个元素的地址。

指针与二维数组

二维数组示意图二维数组示意图
int a[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
std::cout << "a = " << a << "\n";
std::cout << "a[0] = " << a[0] << "\n";
std::cout << "&a[0][0] = " << &a[0][0] << "\n";
std::cout << "a[0][0] = " << a[0][0] << "\n";

/*
a = 0x7fff5fbff600
a[0] = 0x7fff5fbff600
&a[0][0] = 0x7fff5fbff600
a[0][0] = 1
*/

std::cout << "sizeof(a) = " << sizeof(a) << "\n";
std::cout << "sizeof(a[0]) = " << sizeof(a[0]) << "\n";

/*
sizeof(a) = 48
sizeof(a[0]) = 16
*/

int (*p)[4] = a;
std::cout << "p = " << p << "\n";
std::cout << "p[0] = " << p[0] << "\n";
std::cout << "*p[0] = " << *p[0] << "\n";

//将二维转为一维
int *b = (int *)a;
std::cout << "b = " << b << "\n";
std::cout << "*b = " << *b << "\n";
std::cout << "*(b+1) = " << *(b+1) << "\n";
std::cout << "*(b+2) = " << *(b+2) << "\n";
//通过一维数组访问二维数组中的i行n列
*(b + i*rowCount + n);


//作为参数
// int *b = (int *)a;
// test(b, 3, 4);
void test(int *a, int row, int column);
// test(a, 3, 4);
void test(int a[][4], int row, int colum);
// 错误
void test(int **a, int row, int column);
  1. 在二维数组中,数组名a,a[0]的值都是第一个元素a[0][0]的地址。
  2. 二维数组在内存中也是按顺序排列的。
  3. 二维数组在C语言中是一维数组,且每个元素又指向一个一维数组。

demo

点击去下载

参考

理解lvalue和rvalue
指针变量、普通变量、内存和地址的全面对比
《C和指针》

交流群

移动开发交流群:264706196

相关文章

  • C语言

    C 指针、指针变量、函数指针、指针函数、指针数组、数组指针、C 数组

  • C语言21 指针数组与数组指针

    C语言21 指针数组与数组指针 指针数组的定义 指针数组的赋值 结构体指针数组 分析下面的代码 数组指针的定义 数...

  • 学习笔记3(指针运算,函数参数与指针,数组指针,二级指针)

    一、指针运算 二、数组与指针 三、指针和函数参数 java中: C/C++中: 四、指针数组 五、 二级指针 六、...

  • C语言的指针与数组(进阶篇之一)

    一、一维数组与指针 (1).数组指针在C语言中,数组的首地址称为数组指针。而C++规定,数组的首地址可用数组名a表...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • 指针与数组的区别和联系

    原文地址:指针与数组的区别和联系作者:zhenhuaqin 一.指针与数组的联系: 指针与数组是C语言中很重要的两...

  • C语言杂谈:指针与数组 (下)

    思维导图 介绍 前接上文C 杂谈之 指针与数组 (一),接续往下谈指针和数组。 指针与数组 ——承接上文进行扩展 ...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

  • 再学C语言之指针要点

    C之字符数组 C之指针引用字符串 C语言之数组指针 数组指针:首先它是一个指针,它指向数组指针数组:首先它是一个数...

网友评论

      本文标题:C 数组与指针

      本文链接:https://www.haomeiwen.com/subject/zbnsyxtx.html