#include <stdio.h>
//*a是指针变量 a就代表存储地址
void test1(int *a) {
*a = 2;
return;
}
* test2(int *a) {
*a = 323;
return a;
}
int main()
{
printf("------------------------地址--------------------------\n");
int var1;
int var2[10];
printf("var1变量的地址: %p\n", &var1);
printf("var2变量的地址: %p\n", &var2);
printf("------------------------指针与地址--------------------------\n");
int var = 20; /*实际变量的声明*/
int *ip; /*指针变量的声明*/
/*
int var = 20;
int ip;
var 等价于 ip
&ip 等价于 &var
&ip 就相当于存储地址
int var = 20;
int *ip;
var 等价于 *ip *ip 相当于一种特殊的变量名 而ip就相当于 省略了& 的存储地址
ip 等价于 &var
ip 就相当于存储地址
*/
ip = &var;//指向地址
printf("var 变量的地址:%p\n", &var);
printf("在指针变量中存储的地址 %p\n", ip);
printf("使用指针访问值 %d\n", *ip);
printf("--------------------------------------------------\n");
int *ptr = NULL;
printf("ptr 的地址是 %p\n", ptr);
printf("--------------------------------------------------\n");
int var12[] = { 10, 100, 200 };
int i, *ptr1;
/*
指针中的数组地址 var12 默认 第一块地址
*/
ptr1 = var12;
printf("var12 等于 &var12[i] 第一块地址是 %p\n", var12);
printf("&var12[1] 指定第二块地址是 %p\n", &var12[1]);
for (i = 0; i < 3; i++)
{
printf("存储地址:var12[%d] = %p\n", i, ptr1);
printf("存储值:var12[%d] = %d\n", i, *ptr1);
/* 移动到下一个位置 32位 c int 类型是 4个字节 所以地址是以 四个累加输出 */
ptr1++;
}
printf("-----------------指针数组和数组指针---------------------------------\n");
printf("-----------数组指针-----------\n");
/* 数组指针 */
int a[2][2] = { {1,2},{13,14} };
int(*b)[2];
b = a;
//b = &a[0][0];
//指向地址
//b[0] 相当于 第一行数组的地址
printf("b存储值:(指向地址)= %p,%p\n", b[0], (b[0] + 1));
printf("a存储值:(指向地址)= %p,%p\n", a[0], (a[0] + 1));
//b[1] 相当于 第二行数组的地址 地址加一 依次输出地址
printf("存储值:(指向地址)= %p,%p\n", b[1], (b[1]+1));
//b[0] 相当于 第一行数组的地址 b[0][0] 相当于 第一行数组的第一个值
printf("存储值:(输出第一行数组的地址的值)= %d,%d\n", b[0][0], b[0][1]);
//因为前面加了地址符所以输出的是 第一行数组的 各个地址
printf("存储值:(输出第一行数组每个的地址)= %p,%p\n", &b[0][0], &b[0][1]);
//指向数组的 指针数组 *b[0] 指向第一个数组 默认的是第一个数
printf("存储值:(指向数组的值)= %d,%d\n", *b[0], (*b[0]+1));
printf("存储值:(指向数组的值)= %d,%d\n", *b[1], (*b[1]+1));
printf("-----------指针数组-----------\n");
/* 指针数组 */
int c[2][2] = { {5,6},{17,18} };
int *d[2];
*d = c;//
//*d(这代表 整个数组 的地址) *d[0] 代表地址的第一个值 *d[0](默认的)
printf("d存储值:(默认输出第一个地址的第一个值)= %d\n", *d[0]);
printf("&[0][0]正经的第一个地址:(指向数组的地址)= %p\n", &d[0][0]);
printf("d[0]默认的第一个地址:(指向数组的地址)= %p\n", d[0]);
printf("*d默认的第一个地址:(指向数组的地址)= %p\n", *d);
printf("-----------拓展-----------\n");
printf("*(*d+1)输出地址的值:(指向数组的值)= %d\n", *(*d+1));
printf("*(&d[0][0])输出地址的值:(指向数组的值)= %d\n", *(&d[0][0]));
printf("&(*(*d + 1))指向数组的地址:(指向数组的地址)= %p\n", &(*(*d + 1)));
printf("d野指针:(指向数组的地址)= %p\n", d);
printf("-----------函数指针-----------\n");
int h = 3;
printf("h未调用之前 %d,地址 %p\n", h, &h);
test1(&h);
printf("h调用之后 %d,地址 %p\n", h, &h);
printf("-----------函数返回指针-----------\n");
int *u =2321;//指向常量
printf("u未调用之前 %d \n", u);
//printf("*u未调用之前 %d\n", *u); --- 报错
printf("&u未调用之前的地址 %p\n", &u);
int *u1;
u1 = &u;//指向地址
printf("*u1未调用之前的值 %d\n", *u1);
printf("u1未调用之前的地址 %p\n", u1);
//printf("u1未调用之前 %d \n", u1);
//printf("*u未调用之前 %d\n", *u);
//printf("*u1未调用之前 %p\n", *(&u1));
u = test2(&h);
printf("*u调用之后 %d,地址 %p\n", *u, u);
system("pause");
return 0;
}
/*
备注
32位编译器
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
*/