指针2)
*
int x;
x=10;//此写法为简写,x=(int )10;此写为完整形式,
—————————————————————————————————————————
char* x;
short* y;
int* z;
x = (char*)1;
y = (short*)2;
z = (int*)3; //但带*类型,赋值时要写完整形式。并且都是占4个字节
——————————————————————————————————————————
char**** a ;
short**** b ;
int**** c ;
a = (char****)100;
b = (short****)100;
c = (int****)100;
a++;
b++;
c++;
printf("%d %d %d",a,b,c);
结果为104,104,104
char* a ;
short* b ;
int* c ;
a = (char*)100;
b = (short*)100;
c = (int*)100;
a++;
b++;
c++;
printf("%d %d %d",a,b,c);
结果为101,102,104(去掉一个*看类型宽度是多少,是多少就+多少)
——————————————————————————————————————————
char* a ;
short* b ;
int* c ;
a = (char*)100;
b = (short*)100;
c = (int*)100;
a = a - 5;
b = b - 5;
c = c - 5;
printf("%d %d %d",a,b,c);
结果为105,110,120(去掉*号看类型宽度,然后与数字相乘,在想加
——————————————————————————————————————————————
char** a ;
char** b ;
a = (char**)200;
b = (char**)100;
int x = a - b;
printf("%d\n",x);
结果为25(去掉*看类型宽度,然后相减后再除以类型宽度)
———————————————————————————————————————————
1.&
&是地址符,类型是其后面的类型加一个“*”,任何变量都可以使用&来获取地址,但不能用在常量上。
char a = 10;
short b = 20;
int c = 30;
char* =pa
pa=&a
lea取地址:ebp-4的地址放入eax,再将eax里的地址放入ebp-10(pa)里(Ebp- 4里存放的是0a即a的值)
&可以取任何一个变量的地址
&a的类型是a的类型+*==>char*(&a获取a的地址)
char a = 10;
char* pa = (char*)&a;
简写为:
char* pa = &a;
————————————————————————
char** ppa = (char**)&pa;
简写为:
char** ppa = &pa;
————————————————————————————————————————————————————————————————
int x=10;
void
{
int=x;
}
x全局变量,后面是他的地址。y存的是x的值
y存的是x的地址,x是直接寻址(因为x是全局变量
——————————————————————————————————————————
char* x
*x==char(定义char*为x,则*x相当于char。若为char** x,则*x相当于char*)
ebp-8(Ebp- 8里的值是x的地址)里的值放入了ecx里(是一个地址)
将ecx(Ecx也是存的地址)对应的地址的值存入edx(edx里存的是x的值)(把ecx当做地址,取e cx对应的值)
注:ecx有[]指的就是取地址对应的值
————————————————————————————————————————————————————————
指针数组
char arr[10];
char* p = &arr[0]; //取数组第一个元素的地址 ==int& p=arr;
char* p2 = arr; //简写
*(p+i)=p[i]
此时p指数组第一个的地址
*p指第一个的值
———————————————————————)-—————————————————————————
———————————————————————————————————————————————————————————
字符串
char* x = "china";
char y[] = "china";
void Function()
{
*(x+1) = 'A';不能修改(常量区)(char*是指针因此x存的是一个地址,地址指向china。因此x存的地址不能改,china这个值在常量区)
y[1] = 'A';可以修改(全局区,把h改成a
}
——————————————————————————————————————————
void Function()
{
char* x = "china";
在常量区
char y[] = "china";
先将前四个字节拷贝到eax中(eax=6e6968),然后存入ebp-8,再将最后一个字节存入cx中
存入ebp-4
*(x+1) = 'A'; 修改不了
y[1] = 'A'; 修改成功(要修改的数据拷贝到堆栈中了
}
——————————————————————————————————————————————————————————
指针函数
是一个函数,返回值是*类型
1、int strlen (char* s)
返回值是字符串s的长度。不包括结束符'/0'。
int strlen (char* 5)
{int ret =0;
while(*s !=0)
{ret++; (ret是记录长度
s++; }(s是指针
return ret;}
2..char* strcpy (char* dest, char* src); (dest目标字符串的首地址,src复制字符串的首地址,strcpy复制完后的首地址
复制字符串src到dest中。返回指针为dest的值。
char* strcpy (char* dest,char* src)
{
char* ret =dest
while((*dest++)=(*src++));
*dest =*src;
dest++;
src++;
return ret;
}
3、char* strcat (char* dest, char* src);
将字符串src添加到dest尾部。返回指针为dest的值。
char* strcat (char* dest, char* src)
{
while(*dest != '\0') 先将指针指向结尾即0,
{dest++; }
// while((*dest++ = *src++)!='\0'); (先取值,指针++,然后值判断是否=0,
return 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;
}
}
结构体指针
Struct Arg
{
int a;
int b;
int c;
}
int main()
{
Arg* parg;
parg=(Arg*)100
}
—————————————————————————————————————————————
//创建结构体
Student s;
s.a = 10;
s.b = 20;
s.c = 30;
//声明结构体指针
Student* ps;
//为结构体指针赋值
ps = &s;
//通过指针读取数据
printf("%d\n",ps->a);
//通过指针修改数据
ps->a = 100;
printf("%d\n",ps->a);