C语言几个容易混淆概念总结

1.指针数组和数组指针

以二维数组表示开始:

int* a[10]:指针(的)数组 array of pointer,本质是数组,存储的内容是指向int类型的指针,因此大小为10*4=40,位于栈

int  (*b)[10]:数组(的)指针pointer of array ,本质是指针,存储的内容是指向int数组的地址,因此大小是4,可以申请空间,申请的空间位于堆

例如int* a指针,a表示一个一维数组,初始化a=new int[10];

int (*)b[10] = new int[10][10],b表示一个二维数组,


int **ptr指向指针的指针,本质是指针,可表示二维数组



继续深化:3维数组表示

int* a[2][3]:指针数组,一个2*3二维数组,每个元素都是指向int类型数据的指针,大小为6*4=24

int** a[2]:指针数组,一个二维数组,每个元素都是指向int指针的指针,大小为2*4=8

int  (*a)[2][3]:数组指针,指向一个2*3二维数组的指针,

int (**a)[6]:数组指针,指向一个 指向一维数组的指针 的指针


2.指针函数与函数指针

指针函数:本质是函数,是带指针的函数,即返回值是地址。如int* func(void);//声明一个函数原型


函数指针:本质是指针,是指向定义的函数的指针,值为地址。如int (*func1)(void);//定义一个指针变量func1

func1 = f1;//&f1

int f1(void);

进一步利用typedef定义函数指针数据类型 typedef int (*funcType)(void);//定义一个数据类型func

funcType f = f1;//&f1貌似取地址运算符可要可不要

注意funcType与func1已经有本质区别


最常用的用法是

int* f(void);//声明指针函数

.....

int* f(void){return (int*)malloc(4);}//定义函数体


3.指针常量与常量指针

常量指针:指针指向内容不可修改,是常量,内容位于常量区。

如下整型指针常量

int const * a;

const int *a;

示例:

int b = 8;

const int c;

*a = &b;//1位于常量区,不可再被修改

*a = 3;//非法,a指向内容不能修改

a = c;//合法,指针可以被修改

一般函数char* f(const char* st1);传入参数设置为常量指针,表示传入变量所指向内容在函数体内是不允许被修改的。


指针常量:指针本身是不可修改的,但指针指向内容可修改。

int* const a;

示例:

int b = 1;

int* c = &2;

a = b;

*a = 10;//合法,a指向内容可以被修改,同时b也变成10

a = c;//非法,指针a不可改变


对于字符串:

const char* str1 = “12345”;//则字符串指向字符串位于常量区,不可修改

str1[0]='a';//非法


char* s = new char[2];

char* const str2 = s;

str2 = new char[10];//非法,str2不能再被分配新地址


注意:

char* s = "12345";//非常量指针不能指向常量区

char* const s = "12345";//都是不被允许和建议,无法编译通过

vs上是可以,可能当时在vc上,各种蛋疼


进一步

char a[] = "abc";//为数组a分配3个单位内存,指向内容在栈上,与常量指针指向常量区有本质区别

//a是指针常量(char* const),不能再被重新赋地址

a[1] = 'g'//合法

char a[10]="123";//给数组前3位赋值,剩余位自动赋值为0,内容在栈上



4.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值