指针专题2-数组指针和字符串指针

1 数组

int a[5] = {1,2,3,4,5};//在内存中分配5个int类型的内存空间,共4*5=20个字节

数组名a经常被隐式的转换为指向数组首元素的指针常量

2 数组指针

  指向数组的指针叫做数组指针。

int a[5] = {1,2,3,4,5}, *p;
p=a;

这时,下面两列取值,取地址操作是等价的。同时应注意&a[i]和&a[i+1]、a+i和a+i+1、&p[i]和&p[i+1]、p+i和p+i+1差值在32位系统中是4,而不是1.

取地址 取值
&a[i] a[i]
a+i *(a+i)
&p[i] p[i]
p+i *(p+i)

2.1 以指针的方式遍历数组元素

int arr[]={11, 22, 33, 44, 55 };
int len = sizeof(arr)/sizeof(int);    //求数组长度
char i;
for(i=0; i<len; i++)
{
  printf("%d ", *(arr+i));      //*(arr+i)等价于arr[i]
}

  arr是int*类型,每次加1时,arr自身的值(地址)会增加sizeof(int)。

2.2 以数组指针的方式遍历数组元素

int arr[]={11. 22, 33, 44, 55 };
int len = sizeof(arr)/sizeof(int), *p=&arr;    //等价于*p=&arr[0]
char i;
for(i=0; i<len; i++)
{
  printf("%d ", *(p+i));      //*(p+i)等价于*(arr+i)
}

  p、arr、&arr[0] 等价

  *(p+i)、*(arr+i)、arr[i]、p[i ]等价

2.3 借助自增运算符遍历数组元素

  不管是数组名还是数组指针,都可以用上面的两种方式来访问数组元素,不同的是:数组名是常量,他的值不能被改变;数组指针是变量(除非特别指明它是常量),它的值可以任意改变。也就是说,数组名只能指向数组的开头,而数组指针可以先指向数组开头,再指向其他元素。

int arr[]={11. 22, 33, 44, 55 };
int len = sizeof(arr)/sizeof(int), *p=&arr;    //等价于*p=&arr[0]
char i;
for(i=0; i<len; i++)
{
  printf("%d ", *p++);      //*p++等价于*(p++)
}

  *p++不能改为*arr++,因为arr是常量,而arr++相当于arr=arr+1会改变它的值。

int *p=&arr[2]

3 字符串指针

3.1 字符串指针

char str[]="https://www.cnblogs.com/Mike2019/";
char *pstr=str;
int len=strlen(str), i;

//使用*(pstr+i)或*(pstr++)
for(i=0; i<len; i++){
     printf("%c", *(pstr++));
}
printf("
");
//使用pstr[i]
 for(i=0; i<len; i++){
     printf("%c", pstr[i]);
}
printf("
");

//使用*(str+i)
for(i=0; i<len; i++){
    printf("%c", *(str+i));  //这里不能用*(str++),因为str是数组,他是常量
}
printf("
");
//使用str[i]
for(i=0; i<len; i++){
    printf("%c", str[i]);  
}
printf("
");

3.2 字符串常量与字符串数组

(1)字符串常量

char *str="https://www.cnblogs.com/Mike2019/";  //定义一个字符串常量,存储在内存的静态存储区,所以str所指向地址里的数据是不能被改变的。

或者

char *str;
str="https://www.cnblogs.com/Mike2019/";

(2)字符串数组

char str[10] = "hello";  //定义一个字符串数组,存储在动态存储区,数据是可以被改变的

字符串数组和字符串常量两者的区别是:字符串数组存储在全局数据区或者栈区,字符串常量存储在常量区。也就是字符串常量不可以被修改。

"hello"其实就是一个常量,在初始化数组的时候出现的"hello"只是一种特殊情况。  

4 指针数组

  所有元素都是指针的数组叫指针数组。指针数组是多个指针变量,以数组的形式存在内存当中,占有多个指针的存储空间。

int *p[3];  //定义一个存放着三个指针变量的一维数组
int a[3][4];
for(i=0; i<3; i++)
{
    p[i] = a[i];  //将二维数组每一行首地址指向p[i]
}
原文地址:https://www.cnblogs.com/Mike2019/p/11807398.html