数组与指针的区别:
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;
}