指针进阶(1)(上)

简介: 指针进阶(1)(上)

1. 字符指针

指针变量概念:

1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。

2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。

3.指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时.候的权限。

int main()
{
  char ch = 'w';//取字符变量的地址赋给pc,pc是字符指针变量
  char* pc = &ch;
   char* p = "abcdef";//常量字符串,最好在前面加上const,意思不是把字符串的值赋值给p,"abcdef\0"是7个字符,指针变量4个字节,意思是把字符串首元素地址给p
  *p = 'w';//程序报错的原因在于"abcdef"是常量字符串不能更改
  printf("%s\n", p);//不用*p的原因是,*p拿到是a,p是字符串的地址,
  return 0;
}


取字符变量的地址赋给pc,pc是字符指针变量

"abcdef"常量字符串,最好在前面加上const,意思不是把字符串的值赋值给p,"abcdef\0"是7个字符,指针变量4个字节,意思是把字符串首元素地址给p

不用*p的原因是,*p拿到是a,p是字符串的地址,数组在内存中是连续存放的,只要拿到首字符地址,就会一直打印到'\0'


例题1                                                                            

int main()
{
    char str1[] = "hello bit.";
    char str2[] = "hello bit.";
    const char *str3 = "hello bit.";
    const char *str4 = "hello bit.";
    if(str1 ==str2)
 printf("str1 and str2 are same\n");
    else
 printf("str1 and str2 are not same\n");
    if(str3 ==str4)
 printf("str3 and str4 are same\n");
    else
 printf("str3 and str4 are not same\n");
    return 0;
}

530af9983f5645d7ae3af29fe2778659.png


2. 指针数组


指针和数组

1.指针和数组是不同的对象,指针是一种变量,存放地址的,大小是4/8字节的,数组是一组相同类型元素的集合,是可以放多个元素的,大小是取决于元素个数和元素类型的

2.数组的数组名是数组首元素的地址,地址是可以放在指针变量中,可以通过指针访问数组,数组是一段连续的空间,所以返回首元素地址,后面就紧跟着的是后序元素


通过指针遍历数组

#include<stdio.h>
int main()
{
  int arr[10] = { 0 };
  int* p = arr;
  int i = 0;
  int sz = sizeof(arr) / sizeof(arr[0]);
  //赋值
  for (i = 0; i < sz; i++)
  {
    *p = i + 1;//*p++=i+1,*优先级高于++
    p++;
  }
  p = arr;                                                                                                                                                                                                                                                                                                 
  //打印
  for (i = 0; i < sz; i++)
  {
    printf("%d ", *p);//*p++
    p++;
  }
  return 0;
}


*p++=i+1,++优先级高于*,先使用了后置++再执行*,但是后置++执行后的效果体现不出来,要到下一条语句才可以显现出作用,(先使用再++),

*p=i+1,p++<==>*p++=i+1


另一种写法

int main()
{
  int arr[10] = { 0 };
  int* p = arr;
  int i = 0;
  int sz = sizeof(arr) / sizeof(arr[0]);
  //赋值
  for (i = 0; i < sz; i++)
  {
    *(p + i) = i + 1;
  }
//打印
  for (i = 0; i < sz; i++)
  {
    printf("%d ", *(p + i));
  }
}


[] 是个操作符

       i和arr是[]这个操作符的操作数而已,*(arr + i) == *(i + arr) == i[arr];结果都是一样的,但是不建议写成i[arr]

       类比于a + b == b + a;


两种写法的结果是一样的

d797b8d8aa764d198b79d3d179ac15c0.png


指针数组概念

指针数组是数组,指针数组是存放指针的数组

类比于字符数组是存放字符的数组,char arr[5]

整型数组是存放整型的数组 int arr[10]

int main() {
  int a = 10;
  int b = 20;
  int c = 30;
  int d = 40;
  int e = 50;
  int* arr[5] = { &a,&b,&c,&d,&e };
  int i = 0;
  for (i = 0; i < 5; i++)
  {
    printf("%d ", *(arr[i]));
  }
  return 0;
}

ab1db381a343416fbe2fbe76afb6a718.png

abcde五个变量不一定连续,把它们的首元素地址放在arr数组里面,数组在内存中是连续存放的

8aa6f75ad480406286203455e7203e10.png

整型指针数组

使用一维数组,模拟一个二维数组

#include<stdio.h>
int main()
{
  int a[] = { 1,2,3,4 };
  int b[] = { 2,3,4,5 };
  int c[] = { 3,4,5,6 };
  int* arr[3] = { a,b,c };
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    int j = 0;
    for (j = 0; j < 4; j++)
    {
      printf("%d ", arr[i][j]);
    }
    printf("\n");
  }
  return 0;
}


249236c65d96442997e3851f1470f9a6.png

arr[i][j]可写成*(arr[i]+j),一个整型指针(地址)加j向后偏移j个元素


9cc13901fda549d98285392d3a34dd4c.png

用一个数组名表示首元素地址,把a,b,c放到arr中说明是把首元素地址存进去了,因为是个整型地址,所以是个整型指针,所以是int*arr[3]每个元素的类型是int*,本质是用一个指针数组,来管理3个一维数组


字符指针数组

int main()
{
  const char* arr[4] = { "abcdef","qwer","hello world","hehe" };
  int i = 0;
  for (i = 0; i < 4; i++)
  {
    printf("%s\n", arr[i]);
  }
  return 0;
}


761555c906514049921c7caffb7a9b53.png

加const的原因是常量字符串的每个字符串产生的首字符地址,都是以常量字符串的起始地址

相关文章
|
2月前
|
存储
指针进阶详解(下)
指针进阶详解(下)
22 0
|
2月前
|
C语言
【C语言】指针进阶之sizeof和strlen函数的对比
【C语言】指针进阶之sizeof和strlen函数的对比
|
2月前
|
C语言
C语言---指针进阶
C语言---指针进阶
20 0
|
2月前
C进阶:指针的练习(1)
C进阶:指针的练习(1)
|
2月前
C进阶:指针的进阶(4)
C进阶:指针的进阶(4)
|
2月前
|
存储 C语言
C进阶:指针的进阶(1)
C进阶:指针的进阶(1)
|
2月前
|
存储 C语言 C++
C语言指针进阶-1
C语言指针进阶-1
25 1
|
5天前
|
搜索推荐 C语言
详解指针进阶2
详解指针进阶2
|
2月前
|
存储 编译器 C语言
指针进阶详解(上)
指针进阶详解(上)
87 0
指针进阶详解(上)