想要弄清楚指针数组和数组指针的区别,先要弄清楚数组与指针的关系。
int arr[6]={1,2,3,4,5,6};
int *p =arr;
p++;//正确
arr++;//错误
其中 指针是变量,数组是常量,因此不能进行自加操作。指针指向的是地址,数组的名字表示的也是数组的首地址,因此在一定程度上可以类比。
int arr[5]={"hell"};
int *p =arr;
p[2]='d';
定义一个指针指向数组,那这个指针的用法和数组的用法可类比。
数组指针,是一个指向数组的指针,这里指向的数组又分为一维数组,二维数组,三维数组等。
int arr[4]; int *p =arr;
int brr[3][4]; int (*p1)[4] =brr; // p1的操作与brr相同
int crr[2][3][4]; int (*p2)[3][4]; //
brr[3][4]相当于一个brr[4]的一维数组
如果要将一个数组指针指向一个多维数组,则指针指向的是数组的首地址,他的操作是一行一行的,亦称之为行指针,不是一个成员一个成员访问的,这个在使用的过程中要格外注意。
指针数组相对来说好理解一些,表示数组里的每个元素都是一个指针。
这个函数的用法在写应用程序中经常用到,两个函数的后面两个参数最终在使用时是的时候意思是一样的
int main(int argc, char *argv[])
{}
int main(int argc, char **argv)
{}
这里又引出来一个问题,如果在函数中要传递几个字符串,用指针是不行的,必须要用二级指针或者指针数组去保存字符串。二级指针或者指针数组才能保存或指向多个字符串。
1
int main (int argc , char * argv[]) 解释
argc表示命令行总的参数个数
argv[] 是argc个参数,其中第0个参数是程序的全名
eg:./test aaa bbb ccc
2
指针作为函数形参传递时易混淆点
形参都是值传递,
但这个值如果是指针,是可以改变指针指向的内容
如果是指针的值(地址)不会改变实参的值
指针指向的常量存储区是不允许修改的 char* str = “ert”;//常量区
#include <stdio.h>
void test(char *string)
{
string = "hello world";//传的是地址,不改变实参的值,指针指向一个字符串,不会改变原来实参值
}
void test(char *string)
{
char *testString = "world";
string = testString;//此处也是地址传递,不改变实参的值 ,指针指向一个字符串,不改变原来值
}
void test(char *string)
{
//strcpy是一个C语言的标准库函数,是string copy(字符串复制)的缩写。strcpy函数的作用是把含
//有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。
strncpy(string,"world",6);//连带把字符串结尾复制过去 指针传递 值传递 改变实参的值
}
void test(char *string)
{
char *p = "efg";
*string =*p;
*(string+1)=*(p+1);
*(string+2)=*(p+2); //这样直接往地址空间写值,是可以改变实参的值
}
int main()
{
char *str = "abc";
test(str);
printf("str=%s\n",str);
return 0;
}
同样的例子,我们想要在函数中改变一个变量的值,那就得将这个变量的地址传递进去,即使是指针变量也是如此。
func(*p,int a)
{
p =(char *)malloc(sizeof(a))
}
int main()
{
char *str =NULL;
func(srt,100);
} // 这个是错误的表达,必须要传指针的地址进去才行