C语言 指针与数组

来源:互联网 发布:etl数据清洗工具 编辑:程序博客网 时间:2024/06/13 01:18
指针与数组
   定义了类型函数,则要返回相应的值。(return)
指针可以改变局部常量的值。
指针类型要和他指向的类型一致。
上午:指向指针的指针:int a = 0;
    int *p = &a;
    int **p = &p;
其实从取每个指针的地址会发现,指针在内存中其本身有自己的地址,但是因为它是指针,所以它有指向问题,如果从第一个指针指向的地址有问题,会影响之后所有的指针指向。所以,指向指针的地址主要就是指向前一个指针的地址,而取到的的值也是前一个指针取到的值,其中任何一个指针的值改变,都会改变原变量的值。
指针是一种变量,它也有自己的地址,所以它本身也是可用指针指向的对象。我们可以将指针的地址存放在另一个指针中,如:

此时的ppi即是一个指向指针的指针,下图表示了这些对象:

i的地址为108,pi的内容就是i的地址,而pi的地址为104,ppi的内容即是pi的地址。对ppi解引用照常会得到ppi所指的对象,所获得的对象是指向int型变量的指针pi。想要真正地访问到i.,必须对ppi进行两次解引用,如下面代码所示:
printf("%d",i);
printf("%d",*pi);
printf("%d",**ppi);
以上三条输出的结果都是5000。
下午:指针与一维数组和二维数组
int a[4] = {1,2,3,4};
int *p = a;     //等价于int *p;
     //    p = &a[0];
上面定义了一个指针,指向数组的第一个元素a[0]的地址。而指针每加一个地址长度,就是向下一个元素指。在这就同样可以得知,用指针的算术方式去打印其数组中的每一个数值。同时,又诞生出一个新的等价方式,即: *p+n; 等价于a[n];
数组中的值也可以通过指针进行更改。
二维数组与指针:
二维数组相对一维数组,引入了列的概念,所以指针指向时,又多了一个定位去确定一个元素,先通过看下方代码进行解说:
#include<stdio.h>void main(){int a[3][4] = { {1,2,3,4}, {11,12,13,14}, {15,16,17,18} };for (int i = 0; i < 3; i++){for (int j = 0; j < 4;j++){printf("%d\n",a[i]+j);}}printf("逐个打印%d,%d\n",a,*a);//这两行打印的都是第一行第一个元素的地址printf("%d,%d\n",a[0],*(a+0));//printf("%d,%d\n",a[2],*(a+2));printf("%d,%d\n",&a[1][0],*(a+1)+0);printf("%d,%d\n",&a[2],a+2);printf("%d,%d\n",*a[2],*(*(a+2)+0));printf("%d,%d\n",a[1],a+1);getchar();}
从上往下看,首先定义了一个二维数组,之后看for循环,这与之前下标打印二位数组部分相同,但是,打印的a[i]+j是个什么东西呢?看i的定义初始值为0,自加到三,可以与数组的函数相对应,所以不难看出i表示的是行数,与之同理得知j是表示的列数,横竖两个定位即可确定一个点,这个点就是数组元素,前面又有*p = a;这种方式,可以得知循环括号中打印的其实是每一个元素的内存地址。(元素地址:            *(a+i)+j 打印的是地址)
那么下面的打印开始,第一个a[0]打印的是a数组中第一行第一个的地址;后一个也是第一行第一个的地址
第三行第一个元素的地址;a初始元素+i(2)+j(0)没有再加括号的*,可以得知这个取得的还是地址
有地址符在有精确的下标,毫无疑问这个是第二行第一个元素的地址;此时i= 1,j=0,没有再加括号包*,所以取的还是地址
有地址符号,只有行坐标,可以得知这是第三行第一个坐标;a初始元素地址直接加的是i没加j所以,又是一个地址
有*有下标即可以确定一个值的大小,这是第三行第一个元素的值15;后面一个地址外包还有一个*,说明取的是值,看i和j定位的还是15;
只有一个下标没有其他,只是第二行第一个元素的地址;a初始地址+i,也可以得知得出的是地址,因为加1行,所以是第二行第一个数的地址;

今天学习的比较绕,还是要多敲敲代码去解决困扰。 
1 0
原创粉丝点击