案列:
int main(){
int i = 10;
int *p;
p =&i;
printf("%d\n", *p);
printf("p 地址: %#x \n", &p);
printf("i 地址: %#x \n", &i);
i = 20;
printf("%d\n", *p);
printf("p 地址: %#x \n", &p);
printf("i 地址: %#x \n", &i);
printf("sizeof(*p) %d \n",sizeof(*p));
double f = 23.00;
double *fp;
//fp=(double *)ox0000可以强转地址
fp = &f;
printf("f的内存 %d \n", sizeof(f));
//fp 是一个变量 指向double 类型的数据的变量
//fp 存储的地址,地址在本系统就是占用4字节、
//指针变量存储的是地址,所以它的大小不受赋值的变量影响
printf("sizeof(fp) %d \n", sizeof(fp));
printf("f 地址: %#x \n", &f);
printf("fp 地址: %#x \n", &fp);
printf("f的值 %lf \n", f);
printf("fp的值 %lf \n", *fp);
*fp = 100.23;
printf("f的值 %lf \n", f);
printf("fp的值 %lf \n", *fp);
system("pause");
return 0;
}
总结:C++ 完全兼容C;指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。由于程序语言对变量的定义有多种类型,因此指针也就还要分类。
int main(){
//int a = 1;
////自定义头文件可以通过“” 引用
//fun(a);
int b = 10;
int *p;
p = &b;
*p = *p + 10;
printf("b=%d,*p=%d \n", b, *p);
int y = 3 + *p;
printf("y:%d\n", y);
*p += 1;
printf("b=%d,*p=%d\n", b, *p);
(*p)++;
printf("b= %d ,*p= %d ,p address: %#x\n", b, *p, p);
//p++指的*p的下一个地址,不知道系统存储的什么数值
//,在不知道的情况下不要使用,很容易导致崩溃
*p++;
printf("b= %d ,*p= %d ,p address: %#x\n", b, *p, p);
*p = *p + 10;
printf("b= %d ,*p= %d ,p address: %#x\n", b, *p, p);
system("pause");
return 0;
}
=========数组=====
int main(){
//数组名就是数组的首地址
int a[5];
int *p = a;
p = a;
int i;
printf("%#x\n", a);
//a+5 表示啊移动到数组第5个位置
/*for (i = 0; p < a + 5; p++)
{
*p = i;
i++;
}
*/
p = p + 1;
printf("p:%d\n", *p);
system("pause");
return 0;
}
======偏移量和类型有关=====
int main(){
//指针的地址一次偏移量,
//和使用的数据类型有关
int a = 10;
int *p = &a;
printf("p: %d\n", p);
p++;
printf("p: %d\n", p);
char *cp = "hello world";
printf("cp: %d\n", cp);
cp++;
printf("cp: %d\n", cp);
system("pause");
return 0;
}
========c语言中参数交换=========
void swap(int a, int b){
printf("swap a address :%#x,b address :%#x\n", &a, &b);
int temp;
temp = a;
a = b;
b = temp;
printf("swap a :%d,b :%d\n", a, b);
}
void swap2(int *a, int *b){
int *temp;
temp = a;
a = b;
b = temp;
}
void swap3(int *a, int *b){
int temp;
temp = *a;
*a =*b;
*b = temp;
}
int main(){
int a, b;
a = 10;
b = 5;
printf("a address :%#x,b address :%#x\n", &a, &b);
//失败
swap(a, b);
printf("a :%d,b :%d\n", a, b);
//失败
swap2(&a, &b);
printf("a :%d,b :%d\n", a, b);
//成功
swap3(&a, &b);
printf("a :%d,b :%d\n", a, b);
system("pause");
return 0;
}
=======冒泡排序 数组=======
void sort(char *name[], int n);
int main(){
//指针数组
char *name[] = { "hellow", "dongnao", "alivin" };
//数组指针
//char (*name)[5] 这样首地址指针name
int n = 3;
int i;
sort(name, n);
for (i = 0; i < n; i++)
{
printf("%s ", name[i]);
}
system("pause");
return 0;
}
void sort(char *name[], int n){
char *temp;
int i, j;
for ( i = 0; i < n; i++)
{
for ( j = 0; j < n-1-i; j++)
{
if (strcmp(name[j], name[j + 1])>0){
temp = name[j];
name[j] = name[j + 1];
name[j + 1] = temp;
}
}
}
}
========//二级指针=====
int main(){
int a = 100;
int *p;
p = &a;
printf("%d \n", *p);
int **p2;
p2 = &p;
printf("%d \n", **p2);
system("pause");
return 0;
}