第十弹--详解指针

简介: 第十弹--详解指针

指针运算

指针±整数

指针关系运算是与指针类型息息相关,如果是char* 类型,指针变量+1,那么地址增加一个字节。
int main()
{
  int arr1[]={0,1,2,3,4,5,6,7,8,9};
  int* p=arr1;
  int sz=sizeof(arr1)/sizeof(arr1[0]);
  for(int i=0;i<sz;i++)
  {
  printf("%d ",*(p+i));//此时就是指针+整数,地址每次增加4个字节,从而打印下一个数字,最后屏幕输出数组中所有数字   
  } 
  return 0;
}

指针-指针

指针-指针结果为两指针之间元素个数
int my_strlen(char *s)
{
 char *p = s;
 while(*p != '\0' )
 p++;
 return p-s;
}
int main()
{
  printf("%d\n", my_strlen("abc"));//故此打印值为3
  return 0;
}

关系运算(比较大小)

int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int* p = &arr[0];
  int i = 0;
  int sz = sizeof(arr) / sizeof(arr[0]);
  while (p < arr + sz) //指针的⼤⼩⽐较
  {
    printf("%d ", *p);
    p++;
  }
return 0;
}

野指针

野指针成因

1.指针未初始化
int main()
{ 
 int *p;//局部变量指针未初始化,默认为随机值
 *p = 20;
 return 0;
}
2.指针越界
int main()
{
 int arr[10] = {0};
 int *p = &arr[0];
 int i = 0;
 for(i=0; i<=11; i++)
 {
 //当指针指向的范围超出数组arr的范围时,p就是野指针
 *p=i;
 p++;
 }
 return 0;
 }
3.指向已释放的空间
int* test()
{
 int n = 100;//创建的是临时变量,出函数就会被程序释放
 return &n;
}
int main()
{
 int*p = test();
 printf("%d\n", *p);
 return 0;
 }

如何规避野指针

1.指针初始化,就算不知道暂时赋值多少,可以把指针赋值为NULL
2.注意指针越界,申请多少就使用多少,不要越界使用
3.避免使用函数内部创建的局部变量

传值调用 传址调用

传值调用

 void Swap1(int x, int y)
{
  int tmp = x;
   x = y;
   y = tmp;
}
int main()
{
  int a = 0;
   int b = 0;
   scanf("%d %d", &a, &b);
  printf("交换前:a=%d b=%d\n", a, b);
  Swap1(a, b);//只传变量,无法完成交换是传值
   printf("交换后:a=%d b=%d\n", a, b);
 return 0;
}

传址调用

void Swap2(int*px, int*py)
{
   int tmp = 0;
   tmp = *px;
   *px = *py;
   *py = tmp;
}
int main()
{
   int a = 0;
   int b = 0;
  scanf("%d %d", &a, &b);
  printf("交换前:a=%d b=%d\n", a, b);
   Swap1(&a, &b);//传地址,函数中地址改变就可以完成数字交换
  printf("交换后:a=%d b=%d\n", a, b);
 return 0;
 }


相关文章
|
7月前
|
C语言
链栈的初始化以及用C语言表示进栈、出栈和判断栈空
链栈的初始化以及用C语言表示进栈、出栈和判断栈空
78 3
|
2月前
|
存储 C++
栈的深度解析:顺序栈与链栈的实现
栈的深度解析:顺序栈与链栈的实现
|
6月前
|
算法 C语言
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
38 0
|
C语言
【数据结构】链栈的基本操作C语言完整代码(初始化,判栈空,入栈,出栈,取栈顶元素,求栈长)
【数据结构】链栈的基本操作C语言完整代码(初始化,判栈空,入栈,出栈,取栈顶元素,求栈长)
511 0
学C的第十七天【指针初阶: 1. 指针是什么?;2. 指针和指针类型;3. 野指针;4. 指针运算】2
3. 野指针 概念:野指针就是这种指向的位置时不可知的(随机的、不正确的、没有明确限制的)
|
存储
学C的第十七天【指针初阶: 1. 指针是什么?;2. 指针和指针类型;3. 野指针;4. 指针运算】1
1. 指针是什么? (1). 指针是内存中一个最小单元的编号,也就是地址 (2). 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量 总结:指针就是地址,口语中说的指针通常指的是指针变量
|
存储
栈的介绍以及使用数组模拟栈的入栈和出栈
栈的介绍以及使用数组模拟栈的入栈和出栈
115 0
|
存储 算法 安全
【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)
【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)
1655 0