指针和数组

指针:

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程序内存分布:

列表内容

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值