目录
内存四区。
a) 代码区。代码。。 b)全局区。全局的常量字符串常量“abc" 变量 c)栈区。系统自动开辟,系统自动释放。并不是很大。 d)堆区。动态开辟的内存,手动开辟,手动释放。大。
地址
地址: 把内存以单个字节为单位,分开。对每一-个字节编号,这个编号就是地址。 a)编号是连续的。 b) 唯一的。 c) 取地址运算符: &单目运算符优先级"()" "[]" "." 结合性右往左。 int a; //a 一个内存。 &a; s
首地址
首地址:一段内存空间中第--个存储单元的地址。存储单元。
指针变量
指针变量: 1.用来存放地址的变量。2.内存大小4B。 地址是一些编号,一种数据。 整数:int a; 字符:char c;。 小数:float b; 地址:指针变量。
指针变量的定义:
数据类型*变量名;
int *p; //定义一个指针变量p。存的是地址! !。
//int指明指针指向的数据类型。
//*指明p这个变量是一个指针变量.
char *p1 //p1保存一个字符型变量的地址
float *p2 //p2保存一个单精度浮点型变量的地址
指针变量的赋值:
p=&a; //p指向a
指针变量的引用:
访问a这个int变量:
1.使用变量名:
2.指针访问: *指针变量。
注意了:"*"为取值运算符,返回某一个地址中的值。
在定义指针变量的时候int *p; *只是表明p是一个指针变量。。
非定义,*p;取值p指向的内存值。。
printf("%d",*p);
一维数组与指针
定义一个一维数组,数组名是这个数组的首地址
首地址:一段内存空间中第--个存储单元的地址。存储单元。
对于 int a[5];
a指向a[0];a[0]是int类型的元素,a就是int*类型
&a这个地址指向整个数组int(*)[5];
int a[5];
printf("a=%d\n",a);
printf("&a=%d\n",&a);
printf("a+1=%d\n",a+1);
printf("&a+1=%d\n",&a+1);
//运行结果
/*
a=6356716
&a=6356716
a+1=6356720
&a+1=6356736
*/
int a[5]={1,2,3,4,5};
int *p=a;
int i;
for(i=0;i<5;i++){
printf("%d\n",*p++); //p会变
printf("%d\n",*(p+i)); //p不会变
printf("%d\n",*(a+i)); //不能用*(a++);因为a是数组名
}
二维数组与指针
对于一个二维数组a[3][4]
a是指向a[0]这个- -维数组。a的类型是什么? int(*)[4]; a+1 16B。
a[0]指向a[0][0]这个元素; a[0] 的类型是什么? int* a[0]+1 4B.
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p=a;
int i,j;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
int *q=p++;
printf("%d\n",*q++);
}}
求m行n列元素
a[m][n];
*(a[m]+n)
*(*(a+m)+n)
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",a[2][2]);
printf("%d\n",*(a[2]+2));
printf("%d\n",*(*(a+2)+2));
//运行结果
/*11
11
11*/