1、内存
断电会丢失数据,电脑里面的内存条。硬盘断电不会丢失数据。
2、指针
指针到底是什么?->内存地址
数据(变量)存储在内存里面,存储在内存那个位置?->由内存随机分配
如何获取该变量的地址?->使用取地址符号&,就可以得到该变量的地址
程序:获取变量的地址(是一个具体的值)
#include<stdio.h>
int main()
{
int a = 1, b = 2, c = 3;
printf("a的地址:%d,b的地址:%d,c的地址:%d",&a,&b,&c);
//输出结果:a的地址:9435640,b的地址:9435628,c的地址:9435616
while (1);
}
指针常量->固定的内存地址,&a=9435640、&b=9435628,&c=9435616是常量不能修改。不能随便给&a赋值。
指针变量:
#include<stdio.h>
int main()
{
int a = 1;
int* p;//int* 是一种新类型,定义的是地址(&a的值),
//类型(如:int(存的是整形)、char(存的是字符型)、short、long)
p = &a;//把变量a的地址赋值给新类型p
printf("a的地址为:%d\n", p);
printf("a的地址为:%d\n", &a);//&a和p的值是相等的
//输出的结果:a的地址为:3930648
// a的地址为:3930648
while (1);
return 0;
}
看完是否有点懵逼,其实刚开始我也是一样。。
int* p=&a;
int* p;p = &a;
我会不特别理解这两句的区别(是同一句话),其实你只要记住int* 是一起的,是一个新的类型,存地址的类型,那么p就是存地址的。
int* p;//我习惯于把*靠近int来理解,那么p就是一个整型指针变量
//p存的就是地址,p就可以被&a赋值
现在可以从第二句倒过来读
int* p;//定义int* (整型指针类型)p;
p = &a;//把a变量的地址给p,p存的就是地址
指针到底是什么?->内存地址
如果你还看不懂,那应该是我的问题了。(去看看视频教程吧)
3、间接访问
指针(int* p) 间接访问修改变量(int a)的值。
#include<stdio.h>
int main()
{
int a = 1;
int* p;//定义一个指针
p = &a;//把变量a的地址赋值给指针p
printf("1、a=%d\n", a);//1、a=1
*p = 10;//修改a的值,p存的是a的地址,*指向p(内存地址)上面的值a=1;
printf("2、a=%d\n", a);//2、a=10
system("pause");
return 0;
}
4、二级指针
#include <stdio.h>
//二级指针改变量的值
int main()
{
char ch='A';
char* pch=&ch;
char** ppch=&pch;
printf("%c\n",ch);
** ppch='B';
printf("%c\n",ch);
return 0;
}
5、数组和指针
#include <stdio.h>
int main()
{
char ch[10]="ASDFGHJKLP";//定义一个char型数组
char *pch[10];//定义一个指针数组 数组指针:int (*ap)[10];
char **ppch=pch;//一级指针的地址给二级指针
int i;
for(i=0;i<10;i++)
{
pch[i]= &ch[i];//数组的各个元素对应的地址给一级指针
}
for(i=0;i<10;i++)
{
printf("%c ",**ppch);//使用二级指针来访问数组的值
ppch++;
}
printf("\n");
return 0;
}
6、const修饰指针
#include <stdio.h>
int main()
{
int num=1;
const int limit=10;//只读,整数常量
//指向常量的指针 int const *p1等价于const int *p1
const int *p1=&limit;//地址可以变,地址指向的值不能变
//p1=#//合法 地址可以变
//*p1=10;//不合法 地址指向的值不能变
int* p;//指向非常量的指针 地址可以改,地址指向的值也可以改
const int* p;//指向常量的指针 地址可以改,地址指向的值不能改
int * const p;//指向非常量的常量指针 地址可不能改,地址指向的值可以改
const int * const p;//指向常量的常量指针 地址不能改,地址指向的值也不能改
return 0;
}
7、函数指针
#include <stdio.h>
typedef int (*funptr)(int,int);//
//
int add(int num1,int num2)
{
return (num1+num2);
}
int sub(int num1,int num2)
{
return (num1-num2);
}
funptr select(char ch)
{
switch(ch)
{
case '+':
return add;
break;
case '-':
return sub;
break;
}
}
int evaluate(char ch,int num1,int num2)
{
funptr f=select(ch);
return f(num1,num2);
}
int main()
{
printf("%d\n",evaluate('+',5,6));
printf("%d\n",evaluate('-',5,6));
return 0;
}
这篇博客详细介绍了C语言中的内存类型,包括内存的易失性和非易失性,以及指针的概念。通过实例展示了如何获取变量的内存地址,并解释了指针变量和指针常量的区别。此外,还讲解了如何通过指针进行间接访问和修改变量的值,以及二级指针的用法。同时,提到了数组、指针和const修饰符在指针操作中的应用,并探讨了函数指针的使用,展示了如何根据字符选择不同的运算函数。
6439

被折叠的 条评论
为什么被折叠?



