1.函数返回变量的地址
变量的生存期不受函数的影响就可以返回它的地址。
int fun(int* ip)
{
if(ip=!NULL)
{
*ip=100;
}
return ip;
}
int main()
{
int a = 10;
int* p = &a;
int* s = NULL;
s = fun(p);
printf("%d\n", *s);//100
}
2.类型指针+1的限制
struct Student
{
char s_id[20];
char s_name[20];
char s_sex[10];
int s_age;
};
int main()
{
char* cp = NULL;
int* ip = NULL;
double* dp = NULL;
int** s = NULL;
struct Student* stp = NULL;
printf("cp : size %d\n", sizeof(cp));//4
printf("ip : size %d\n", sizeof(ip));//4
printf("dp : size %d\n", sizeof(dp));//4
printf("s : size %d\n", sizeof(s));//4
printf("stp : size %d\n", sizeof(stp));//4
return 0;
}
无论什么类型,指针变量大小为四字节。
那么类型对指针有什么作用呢,根据指针类型的不同,+1时也不同,类型占的字节数越多,地址增加的就越快。
typename *p = &ar[0]
p = p+1;
p = p + sizeof(typename)*1
int型 加了四字节
#define N 5
int main()
{
int ar[N] = { 1,2,3,4,5 };
int* ip = &ar[0];
for (int i=0;i<N;i++)
{
printf("%p=>%d\n", ip, *ip);
ip = ip + 1;//加了四字节
}
return 0;
}
double型 加了八字节
#define N 5
int main()
{
double ar[N] = { 1.1,2.1,3.1,4.1,5.1 };
double* ip = &ar[0];
for (int i = 0; i < N; i++)
{
printf("%p=>%f\n", ip, *ip);
ip = ip + 1;//加了8字节
}
return 0;
}
char型 加了一字节
#define N 5
int main()
{
char ar[N] = { 't','u','l','u','n'};
char* ip = &ar[0];
for (int i = 0; i < N; i++)
{
printf("%p=>%f\n", ip, *ip);
ip = ip + 1;//加了1字节
}
return 0;
}
3.取值和自增运算符的结合
#define N 5
int main()
{
int ar[N] = { 12,23,34,45,56 };
int* p = &ar[0];
int x = 0, y = 0;
x = *p++;
y = *p;
printf("x: %d y: %d", x, y);//12,23
x = ++*p;
y = *p;
printf("x: %d y: %d", x, y);//24,24
x = *p++;
y = *p;
printf("x: %d y: %d", x, y);//34,34
return 0;
}