C语言指针和数组

一个简单的例子

test1:

#include

int main(void){
    char *p = "abc";
    *(p+1) = 'd';
    printf("%s\n",p);
    return 0;
}

运行结果:

Segmentation fault (core dumped)

test2:

#include

int main(void){
    char arr[10] = "abc";
    char *p = arr;
    *(p+1) = '0';
    printf("p = %s\n",p);
    printf("arr = %s\n",arr);
    return 0;
}
    

运行结果:

p = a0c
arr = a0c

 

分析test1和test2

test1中直接将字符串赋值给了字符指针,然后对该字符串进行修改,结果报错了。这是因为此时的字符串是常量,存放在文字常量区(看网上是这么称呼的),不能对其进行修改,此时只能通过指针访问该字符串常量。

test2中的字符串abc存放于中,可以通过指针或数组去修改或访问。

引用:https://zhidao.baidu.com/question/96026872.html

 

test3:

#include
int main(void){
   char arr[10] ;
   char arr2[10] = "123";
   arr = arr2;
   char *p  = arr2;
   arr = p;
   return 0;
}

运行结果:

a.c: In function ‘main’:
a.c:5:8: error: incompatible types when assigning to type ‘char[10]’ from type ‘char *’      arr = arr2;
a.c:7:8: error: incompatible types when assigning to type ‘char[10]’ from type ‘char *’       arr = p;

从结果中看出,将arr2赋值给arr以及将p赋值给arr都报了相同的类型不兼容错误,在C语言中,数组名是一个常量,是不能够对其进行修改的。从报错信息中可以看出,无法将char*类型分配给char[10]类型,在我个人理解中,当数组名放在=右边时,这时是被当作指针类型来使用的。就像char *p = =arr2; 这条语句没问题,将指针赋值给指针。

指针,是一个变量,它保存的是地址;数组名,是一个常量,也保存的是地址。只不过,指针保存的内容是可以改变的。

 

数组指针和指针数组,引用http://c.biancheng.net/view/335.html

int *p1[5];
int (*p2)[5];

对于 int *p1[5];  因为“[]”的优先级要比“*”要高,所以 p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,而“int*”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。

C语言指针和数组_第1张图片

 对于语句“int(*p2)[5]”,“()”的优先级比“[]”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,p2 是一个指针,它指向一个包含 5 个 int 类型数据的数组,如图 2 所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。

C语言指针和数组_第2张图片

test4:

#include
int main(void){
    int arr[5]={1,2,3,4,5};
    int (*p1)[5] = &arr;
    int (*p2)[5] = arr;
    return 0;
}

编译结果:

a.c:5:20: warning: initialization from incompatible pointer type [enabled by default]
     int (*p2)[5] = arr;

&arr与arr代表含义不同,&arr表示整个数组的首地址,arr表示数组首元素的首地址,虽然它们值相同,但意义不同。详细解析请看转载:http://c.biancheng.net/view/335.html

 

泛型指针 引用书籍《算法精解C语言描述》第2章

通常情况下,c只允许相同类型的指针之间转换。但泛型指针能够转换成任何类型的指针。通常声明一个void指针来表示泛型指针。其使用场景很广,比如函数的参数中

#include
#include
int swap(void *x,void *y ,int size){
    void *tmp;
    if((tmp = malloc(size)) == NULL)
        return -1;
    memcpy(tmp,x,size);
    memcpy(x,y,size);
    memcpy(y,tmp,size);
    free(tmp);
    
    return 0;
}

将swap参数设置为void指针,就变成了一个可以交换任何类型的通用交换函数。

 

你可能感兴趣的:(学习积累)