指针数组与数组指针

想要弄清楚指针数组和数组指针的区别,先要弄清楚数组与指针的关系。

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);
}   // 这个是错误的表达,必须要传指针的地址进去才行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值