综述
int型变量当指针用
void func(char* p[])
{
*p="ABCDEF";
}
int main()
{
int A; //int 型用作指针
func((char**)&A);
cout<<(char*)A<<endl;
return 0;
}
char、char[]、char[20]、char&做函数参数时的异同*
只有char&在函数栈中不占用空间,其他均会在函数栈中开辟空间,有一次形参——实参匹配赋值的过程。
故,自以为从编译器的角度,应该把char&解释为传址,其他均解释为传值(char*、char[]也解释为传值,因为有指针的赋值)。
const在指针强制转换面前形同虚设
void func(const char *p)
{
char *p1 = (char*)p;
*p1 ='b';
}
指针、函数、数组等稀奇古怪的声明方式
void(*signal(int signo, void(*func)(int)))(int);
指针与数组名本质区别
int A[20];
int *p = A;
p[1] = *(p+1)
A[1] = *(A+1) //比指针写法在取值时少一次间接取址
指针与数组何时相同
ANSI C规定:函数参数中数组写法等同于指针,但不包括其所指类型。
例:int func(char *p[5]) 与 int func(char (*p)[5])不同。
ANSI C规定:在表达式中,数组|指针 下标写法等同于偏移量写法。
用字符串初始化指针和数组的区别
char *p = “ABCDEFG”;
char p[] = “ABCDEFG”;
//前者放于只读段内,不可修改,后者依据p[]的特性可能是静态存储区/栈。
函数形参——实参匹配过程和返回值的本质
赋值
想实现传统传址的方法就是:地址赋值。
赋值时,不用考虑空间有效性问题,只需考虑值对不对的问题。
赋值之后,值所表示的地址在新的空间里必须是有效的。
const类指针赋值问题
const int *p1; int *p2; p1=p2;(正确) p2 = p1;(错误)
const int **p1; int **p2; p1=p2;(错误) p2 = p1;(错误)
/**
ANSI C解释:
如果相互赋值的是两个指针,则
1.两个操作数都是指向有限定符或无限定符的相容类型的指针 (或)
2.左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
但是:在强制转换面前,const是浮云。
**/
更多详细介绍参见: