C中的指针和数组

指针

定义

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。

初始化

(1)定义指针p,且指针指向内容的数据类型是整型int *p
(2)指针p的值为NULLp=NULL

int *p = NULL;

(1)定义指针p,且指针指向内容的数据类型是整型int *p
(2)指针p值设为NULL*p = NULL
这种方式并没有对指针p初始化!!!

int *p;
*p = NULL;

运算

1.指针与整数
一个指针 ptrold 加(减)一个整数 n 后,结果是一个新的指针 ptrnew,ptrnew 的类型和 ptrold 的类型相同,ptrnew 所指向的类型和 ptrold所指向的类型也相同。ptrnew 的值将比 ptrold 的值增加(减少)了 n 乘sizeof(ptrold 所指向的类型)个字节。就是说,ptrnew 所指向的内存区将比 ptrold 所指向的内存区向高(低)地址方向移动了 n 乘sizeof(ptrold 所指向的类型)个字节。

2.指针与指针
(1)两个指针不能进行加法运算,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。

(2)两个指针可以进行减法操作,但必须类型相同,一般用在数组方面。

常见问题

关于指针有几个问题:
1.变量是什么类型的?
2.指针变量的类型是什么?
3.指针指向的类型是什么?
4.指针的值(指向的内存区)是什么?
5.指针本身的内存大小是多少?

问题一:变量是什么类型的?

无论多么复杂的数据类型,都从变量名开始,根据运算符优先级,一步一步分析

例如:

int p;        //变量名为p;与int结合,变量的数据类型是整型
int *p;       //变量名为p;与*结合p是一个指针;与int结合,
		指针指向内容的类型为int。所以p是一个返回
		整数类型的指针
int p[3];     //变量名为p;与[]结合,p是一个数组;与int结合,
		数组的元素是int类型的。所以p是一个由整型
		数据组成的数组

//注意[]的优先级比*高
int *p[3];    //变量名为p;与[]结合,p是一个数组;与*结合,
		数组里的元素都是指针类型;与int结合,指针
		指向内容的类型为i整型的。所以p是一个由返
		回整型数据的指针所组成的数组(指针数组)
int (*p)[3];  //变量名为p;与*结合,p是一个指针;与[]结合,
		指针指向的内容是一个数组;与int结合,数组
		里的元素是整型的。所以p是一个指向由整型数据
		组成的数组的指针(数组指针)


int p(int);   //名字是p;与(int)结合,p是一个函数,该函数有一个
		整型变量的参数;与int结合,函数的返回值是整型数据
		int (*p)(int);  //名字是p;与*结合,p是一个指针;
		与(int)结合,指针指向一个函数,该函数有一个整型变量
		的参数;与int结合,该函数返回一个整型数据(函数指针)

int *(*p(int))[3]; //名字是p;与(int)结合,p是一个函数,该函数
		有一个整数类型的参数;与*结合,该函数的返回值是一个指针;
		与[]结合,返回的指针指向一个数组;与*结合,数组的元素是
		指针;与int结合,指针指向的内容是整型的。

问题二:指针的类型是什么?

通常来说,把变量名去掉就是指针的类型

int *ptr;//类型是int *
int (*ptr)[3]; //类型是int (*)[3]

问题三:指针指向的类型是什么?

通常来说,把指针声明语句中的指针名字和名字左边的指针声明符 * 去掉,剩下的就是指针所指向的类型。

int *ptr;//类型是int 
int (*ptr)[3]; //类型是int ()[3]

问题四:指针的值(指向的内存区)是什么?

指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区

问题五:指针本身的内存大小是多少?

指针的值是一个地址,而在32位系统中,地址都是32位的(4字节

数组

a,&a,&a[0]

指针和数组的关系

以往指针或下标的方式访问指针或数组

&p[4][2]-&a[4][2]

a[i][j] == &a[i]+j*sizeof(char) == a+i*sizeof(char)+j*sizeof(char) == *(*(a+i)+j)

posted @ 2023-07-02 16:22  我好想睡觉啊  阅读(3)  评论(0编辑  收藏  举报