数组与指针的区别与联系,函数指针,指针函数,指针数组,数组指针

数组与指针的区别:

C语言把内存划分成四个区,它把一般的变量和数组等存在于内存中的栈区,所以数组在C语言的定义中只是一组同类型的普通变量,即使这个变量有可能是指针。所以他的作用比指针小的很多,而指针可以指向任何区的任何数据,所以就会觉得指针和数组名很像,但是必须要注意的是,数组名只是指针中的一种,它是指针中只指向栈区的且指针的移动范围是有限的,即数组长度。而且数组在定义之初就已经有了自己的内存,一般的指针如果未指向某一个内存块时,它是没有自己的内存的,即所谓的野指针。

联系:如上面所说,数组只是定义在栈区的一个连续变量,它的首地址就是一个指针。

总结:不仅数组有指针,所有变量都有指针,指针说白了就是内存中的地址,就像一个房间必须有一个房间号。在C/C++语言中定义一个指针,就是在栈区开辟一个内存空间用来存放它指向的内存地址,然后给指针赋值,就是把地址值赋值给刚才开辟的内存空间,然后通过访问该内存中的地址值来间接访问该地址下存放的数据。如果该地址值指向的是一块静态存储区,如字符串常量等,当然就不可以修改指向的内容啦。

指针数组

指针数组是一个数组,数组的元素保存的是指针;

数组指针

数组指针是一个指针,该指针指向的是一个数组;

#include <stdio.h>
 
#define SIZE 5
 
int main(int argc, char const *argv[])
{
	int arry[5]  = {1,2,3,4,5};
	int (*p)[SIZE] =  &arry ; //数组指针,该指针指向一个数组;
	for(int i = 0 ; i < SIZE ; i++)
	{
		arry[i] = (i + 1) * 10 ;
		printf("%d:%d\n",(*p)[i],*(p[i]));
		printf("%p\t%p\t%p\t%p\n",&(p[i]),p[i],&(*p)[i],&(arry[i]));
	}
	printf("\n\n\n");
	int *p1[SIZE] = {nullptr,nullptr,nullptr,nullptr,nullptr} ; //指针数组;
	
	p1[0] = arry; //p1[[0]是一个指针;
	//p[0] = arry ; 语法错误 p[0]是一个数组;
	
	for(size_t i = 1 ;i < SIZE ; i++)
	{
		p1[i] = new int[SIZE] ;
		for(int j = 0 ; j < SIZE ; j++)
		{
			p1[i][j] = i * (j + 1);
		}
	}
 
	for(size_t i = 0 ;i < SIZE ; i++)
	{
		for(size_t j = 0 ; j < SIZE ; j++)
		{
			printf("%p:%d\t",&p1[i][j],p1[i][j]);
		}
		printf("\n%d:%d\n",(*p)[i],*(p[i]));
		printf("%p\t%p\t%p\t\n\n",&(p1[i]),p1[i],&(*p1)[i]);
	}
}

指针函数与函数指针

指针函数

指针函数是一个函数,该函数返回的是一个指针;

函数指针

函数指针是一个指针,该指针指向一个函数;

#include <stdio.h>
 
int* getIntPoint(const int a) //指针函数,是一个函数 返回一个指针;
{
	int *p = nullptr ;
	p = new int ;
	*p = a; 
 	return p ;
}
 
 
int main(int argc, char const *argv[])
{
	int *(*p)(int)  = getIntPoint ; //函数指针,该指针指向一个函数;
	int* pInt = p(5); //使用函数指针;
	printf("%d\n",*pInt);
	delete pInt ;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41066529/article/details/89509406