指针:
1.指针是指向其所向内容的首地址的。
2.指针的类型决定指针在取值的时候取几个字节。
#include <studio.h>
int main(void)
{
int var = 0x12345678; //&var :int*
int *ptr = NULL; //&ptr :int**
int **pptr = NULL; //&pptr:int***
int ***ppptr = NULL; //&ppptr:int****
ptr = &var;
pptr = &ptr;
ppptr = &pptr;
var = 0x78564312;
*ptr = 0x78564312;
**pptr = 0x78564312;
***pptr = 0x78564312;
segement fault //指针出错
pptr=(int**)&var;
int *ptr = &var;
pptr=&ptr;
*ptr = 0x78564312
return 0;
}
gdb:Linux中调试命令
(gdb) break main (设置断点)
(gdb) b 7
(gdb) step
werror:把warning当做error处理
gcc -werror -wall:把warning当做error处理并列出所有警告
地址位数与指针类型无关
char *ptr = “hello”
sizeof(ptr) 32位系统:4字节 64位系统:8字节
改变此段内存空间的值:
var = 0x78123456
*ptr = 0x78123456
#include <studio.h>
int main(void)
{
int a = 0x12345678;
int *p1 = NULL;
char *p2 = NULL;
p1 &a;
p2 = (char *)&a;
print("p1 address:%p p1 value:%p p1 point memory value: 0x%x\n",&p1,p1,*p1);
print("p2 address:%p p2 value:%p p2 point memory value: 0x%x\n",&p2,p2,*p2);
p1++; p2++;
print("p1 address:%p p1 value:%p p1 point memory value: 0x%x\n",&p1,p1,*p1);
return 0;
}
改变寄存器地址:30008000->0xabcd
(volatile unsigned short*)30008000 = 0xabcd
void get_memory(char *ptr,int size)
{
ptr=malloc(size);
}
#include<stdio.h>
int main(void)
{
int a = 0x12345678;
char *p2 = NULL;
int i;
p2 = (char*)&a;
for (i=0;i<4;i++)
{
printf("0x%02x",*(p2+i))
}
}
int main()
{
char *ptr = NULL; //若ptr不赋值,则值随机。栈空间:类比教室.
get memory(ptr,100);//错误
strcpy(ptr,"hello");
printf("%s",ptr);
free(ptr)
//堆空间:类比寝室。需要时向系统申请,用完(毕业)后free释放,若不释放,内存泄露
}
const 关键字
int a =10;
const int b = 20;
const int *p1 = &a; //int const *p1; 指向的内存的值不变
int * const p2 = &a; //指向的地址不变
const int * const p3 = &a;
*p1 = 30; (×) p1 = &b; (√)
*p2 = 30; (√) p2 = &b; (×)
*p3 = 30; (×) p3 = &b; (×)
不想执行一段代码:
#if 0
代码
#endif
想执行一段代码:
#if 1
代码
#endif
设置一段内存的值为0:
memset(days_per_month,0,sizdof(days_per_month))
ptr++ ? *ptr++ (*ptr)++ ptr[0] ptr[1]
ptr指向下一位 取值,再移动到下一位 取值,值++
二维数组是按行存储的:
rain[5][12]
rain[i][j]=rain[12*i+j]
int (*p1)[12]; p1是一个指针,类型:int[12] p1++(指向下一行)
VS
int p2[12]; p2[12]:数组,数组类型:int 数组中每一个元素类型都为int* p2++(指向下一个数)
p1 ++ VS p2++
C程序内存分布:
列表内容
系统空间:每个程序运行独立4GB虚拟内存空间 命令行传递的参数: int main(int argc, char **argv) 栈区:
局部变量(自动分配,{}内有效,离开{}自动) 堆区: malloc分配的内存(自己管理,用完free,否则泄漏)
栈区: 局部变量(自动分配,{}内有效,离开{}自动) 堆区: malloc分配的内存(自己管理,用完free,否则泄漏)
.bss: 未初始化的全局变量或static变量,值为0 .data: 初始化过的全局变量或static变量 .rodata:
const, #define,char *ptr=”string”等定义的数据常量
.rodata: char *ptr = “hello” const int a = 10;#define MSG_STR "hello world"
编译出来的可执行文件的二进制代码
cal_total_calltimes()
{
static int a = 0;
a++;
printf("a:%d\n",a);
}
main()
{
for(i=0;i<10;i++)
cal_total_calltimes();
}
static:修饰变量:C程序存储在数据段中,在程序编译运行中一直可见存在不消亡。
修饰函数:静态函数,只能被本C文件调用,不能被别的C程序调用
{
int i;
int *ptr = NULL;
ptr = (int *) malloc(10*sizeof(int));
//ptr在栈区,它指向的内存空间10*sizeof(int)在堆区
for(i=0; i<10; i++)
{
ptr[i] = i;
}
free(ptr);
}
atoi函数:将字符串转换为整数
segmentation fault:凡是看到这个错误,代表段错误,一定是指针出错。
全局变量:
int g_var
静态:
static int s_var
statice in sg_var