在一/二级指针的状态下,“指针是地址”概念是适用的。但在更高级别的状态下,这一概念就不再适用了
一、指针的基本性质
1
带类型的变量赋值时只能使用“完整写法”.
带类型的变量宽度永远是4字节、无论类型是什么,无论有几个*.
2
1、不带*类型的变量,++或者-- 都是假1 或者减1
2、带*类型的变量,可是进行++ 或者 --的操作
3、带类型的变量,++ 或者 – 新增(减少)的数量是去掉一个后变量的宽度
3
1、带*类型的变量可以加、减一个整数,但不能乘或者除.
2、带*类型变量与其他整数相加或者相减时:
带*类型变量 + N = 带*类型变量 + N*(去掉一个*后类型的宽度)
带*类型变量 - N = 带*类型变量 - N*(去掉一个*后类型的宽度)
3、两个类型相同的带*类型的变量可以进行减法操作.
4、想减的结果要除以去掉一个*的数据的宽度.
5、带*的变量,如果类型相同,可以做大小的比较。
二、&与*
char a = 10;
short b = 20;
int c = 30;
char* pa = &a;
short* pb = &b;
int* pc = &c;
char** ppa = &pa;
short** ppb = &pb;
int** ppc = &pc;
&是地址符,类型是其后面的类型加一个“*”,任何变量都可以使用&来获取地址,但不能用在常量上。
&是地址符,类型是其后面的类型加一个“*”,任何变量都可以使用&来获取地址,但不能用在常量上。
在带 * 类型的变量前面加 * ,类型是其原来的类型减去一个*.
三、常量区问题
哪个可以修改?哪个不能改?
char* x = "china";
char y[] = "china";
void Function()
{
*(x+1) = 'A'; //不能修改
y[1] = 'A'; //能修改
}
void Function()
{
char* x = "china";
char y[] = "china";
*(x+1) = 'A'; //不能修改
y[1] = 'A'; //能修改
}
关于数字
内存状况如下图所示
关于字符串
1、int strlen (char* s)
返回值是字符串s的长度。不包括结束符'/0'。
2、char* strcpy (char* dest, char* src);
复制字符串src到dest中。返回指针为dest的值。
3、char* strcat (char* dest, char* src);
将字符串src添加到dest尾部。返回指针为dest的值。
4、int strcmp ( char* s1, char* s2);
一样返回0 不一样返回1
int strcmp(char* s1, char* s2)
{
while(*s1 != '\0' && *s2 != '\0')
{
if(*s1 != *s2)
{
return 1;
}
s1++;
s2++;
}
if(*s1 == '\0' && *s2 == '\0')
{
return 0;
}
else
{
return 1;
}
}
char* strcpy (char* dest,char* src)
{
while((*(dest++)=*(src++))!=0);
return dest;
}
int strlen (char* s)
{
int len = 0;
while(*(s) != 0)
{
len++;
s++;
}
return len;
}
char* strcat (char* dest, char* src)
{
while(*dest != '\0')
dest++;
while((*dest++ = *src++)!='\0');
return dest;
}
四 结构体指针
五 数组指针
int *p[5] 与 int (*p)[5] 有什么区别?
原因:
[] 的优先级高于* 所以先组合成p[5]数组 再由int 说明 数组存储的类型 == int p[5];
() 的优先级高于[] 所以*先p先组合成指针 再由int[5]说明数组的宽度
注意 *(*p)等同于p[0][0]
六 函数指针
函数指针的声明:
返回类型(*函数名)(参数表)
如:int (*pFun)(int,int);
函数指针不能进行 ++ – 等操作
隐藏代码到数据区:
找到硬编码
开始操作
unsigned char code[] =
{
0x55,
0x8B, 0xEC,
0x83, 0xEC, 0x40,
0x53,
0x56,
0x57,
0x8D, 0x7D, 0xC0,
0xB9, 0x10, 0x00, 0x00, 0x00,
0xB8, 0xCC, 0xCC, 0xCC, 0xCC,
0xF3, 0xAB,
0x8B, 0x45, 0x08,
0x03, 0x45, 0x0C,
0x5F,
0x5E,
0x5B,
0x8B, 0xE5,
0x5D,
0xC3
};
int main(int argc, char* argv[])
{
typedef int (*Fun)(int,int);
Fun p = (int (*)(int,int))&code;
int x = p(2,2);
printf("%d\n",x);
return 0;
}
成功