指针1

声明与赋值

指针也是一种数据类型,在任何基本数据类型后面加一个或多个*号,一个星号与多个星号是完全不同的概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"

void fun()
{

char x =(char)1;//完整赋值语句
short y =(short)2;
int z =(int)3;
}

int main(int argc, char* argv[])
{

fun();
getchar();
return 0;

}

宽度

带星号的类型只能使用完整写法赋值,32位操作系统指针大小多数为四个字节,这并不是统一的,不同的操作系统或硬件平台可能会有不同的指针大小,指针指向的数据多大需要分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"

struct AA
{
int a;
int b;
int c;
};

void fun()
{

char* x =(char*)1;
short* y =(short*)2;
int* z =(int*)3;
AA* a =(AA*)4;
}

int main(int argc, char* argv[])
{

fun();
getchar();
return 0;

}

自增

带星号的类型进行自增自减运算都是以去掉一个星号后类型的大小来运算,推荐各位试试两个星号运算的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"


void fun()
{

char* x =(char*)10;
short* y =(short*)10;
int* z =(int*)10;

x++;
y++;
z++;

printf("%d %d %d",x,y,z);
}

int main(int argc, char* argv[])
{

fun();
getchar();
return 0;

}

image-20231109090256641

image-20231109090428686

加法运算

带星号的类型进行加法运算都是以去掉一个星号后类型的大小乘以加数来运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"


void fun()
{

char* x =(char*)10;
short* y =(short*)10;
int* z =(int*)10;

x+=5;
y+=5;
z+=5;

printf("%d %d %d",x,y,z);
}

int main(int argc, char* argv[])
{

fun();
getchar();
return 0;

}

image-20231109090646765

求差值

必须是相同类型,星号和基本类型必须完全一样的变量才可以相减

结果要除以去掉一个*的数据的宽度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdafx.h"


void fun()
{

char** x =(char**)200;
char** y =(char**)100;


int a=x-y;


printf("%d",a);
}

int main(int argc, char* argv[])
{

fun();
getchar();
return 0;

}

image-20231109090942023

image-20231109090901281