C++指针相关梳理

文章详细阐述了C语言中指针的概念,如何用指针作为数组的迭代器,以及指针与字符串常量的关系。指针可以指向字符串首地址,但不能指向整型常量。字符串可以通过数组名或指针引用,strcat函数用于连接字符串,但需注意避免写入常量内存区域或数组越界。此外,文章还讨论了指针变量与所指向内存的区别,以及内存的堆栈区分。
摘要由CSDN通过智能技术生成

指针是数组的迭代器(指针就是迭代器)
0.字符串数组:
char a[3][25]= {"XUANXIU YUWEN ", “XUANXIU YUWEN”, “FEIXUANXIU TIYU”};就行了 定义成二维数组存储时可以简单看作一排一个字符串数组,
char* a[10] = {“XUANXIU”, “YUWEN”, “XUANXIU”, “SHUXUE”, “FEIXUANXIU”, “TIYU”};这样是定义了一个指针数组 指针元素分别指向每一个对应的字符串存储的首地址

1.C语言指针为什么可以指向字符串常量,却不可以指向整型常量 (https://www.cnblogs.com/Stephen-Qin/p/9643272.html)
 
char * c=“hello”;//等价于char * c; c=“hello”,这里比较特殊.字符串直接使用代表字符串首地址。
C只可以用指针取字符串常量的地址,该类被认为是左值,而其他的字面值常量(literal constant),则被认为是右值,不允许取地址。

而对于int类型,你可以这样改就能用指针了:
int a=2;
int*p=&a;

2.字符串的引用方式:
用数组名和输出格式%s可以输出整个字符串.比如:
char str[] = “I love China”;
printf(“%s\n”, str);//输出完整字符串
printf(“%s\n”, str + 2);//只输出love China,规定了起点。

类中也有这样的情况 
class A
{
public:
    A(int i, char *p) :ival(i), ptr§ {};
 
    int ival;
    char *ptr;
};
void main()
{
    A a(9, “hello”);
    cout << a.ival << a.ptr << endl;//这里a.ptr输出hello,即字符指针能直接输出它所指向的字符串。
    system(“pause”);
}

3.指针和int常量的用法都也忘光光了
int a = 1;//指针指向变量单元,不能指向int常量,所以要有a来存储.
int *p = &a;//等价于int *p; p = &a;但绝不可以写作:int *p; *p = a;//这样出错,p需要p = &a这样的初始化。
*p = 2;//因为有之前的初始化,才可以这样做.

有一种编译时不报错,运行时报错的写法:
int p = NULL;
p = 2;
这符合c的语法,编译不报错,因为已经对p初始化了.但是空指针表明自己不再指向任何对象,(而非空指针是指向其他变量,比如变量a,对
p赋值就是改变a的值)再对
p赋值就会出现错误了.如下:

4 字符串指针与字符数组的区别
void main(){
char *s=new char[5];
s=“abcd”;
s[2]=‘y’;
}执行时会有内存读写错误,但是改为:
void main(){
char s[]=“abcd”;
s[2]=‘y’;
}却没有错误,我知道变量一个在堆区,一个在栈区,为什么会出现这个问题
 
回答
关键是s="abcd"有问题,即使s不是动态指针(比如char * c=“hello”),也会报错。
char *s只是个指针而已,没有分配存储空间的,(指针只是指向某一块内存)
而"abcd"是字符串常量,它是被储存在内存的静态区中的,静态区中的数据是不能被更改的,

char s[]="abcd"等于是你在栈中为s开辟了一个5字节的空间(数组是自己有开辟了内存)
等价于char s[5],所以这个时候你把一个字符s[2]='y’等于是把y放入了栈中

5.关于strcat()(连接函数)的第一个参数, char a[] = “abcd”; char* b = “abcd”; char c[] = “efg”;
strcat(b, c)运行出错,可是为什么strcat(a,c)可以?

最佳答案
其实strcat(b, c),strcat(a,c)都有错

通俗的来讲:

strcat(b, c)运行出错是因为b是一个指向常量字符串的指针,指向的是一片不能运行时改变的内存区域,向内存区域中写入其它的数据,必然会使程序崩溃;而a则是指向一个变量内存区域,是可以动态改变的,a虽然没有足够的空间导致溢出(因为char a[] = “abcd”,数组的长度为5,固定下来了),但c语言不检查数组越界,依然可以写入,但是写入的内纯区域已经不受控制,说不定就覆盖了某些其它变量,是很危险的操作,出错了也很难查找原因。。。
 
注意char a[] ={‘a’,‘b’,‘c’,‘d’}; 数组a的长度为4,
char a[] = “abcd”,数组a的长度为5,等价于char a[] ={‘a’,‘b’,‘c’,‘d.’\0’'};

6.声明指针变量时系统分配的内存,和指针所指向的内存
这么跟你说,指针本身也是一种变量,就和int型一样,假如你声明int a,其中a是变量名,有自己的一个地址,然后a的值,是另外一个地址,计算机通过变量名就能知道变量值是多少,同样的道理,你声明int p,p是变量名,在计算机中是有独立的内存空间用来存放p的,这样明白吗?只有当你给p赋值的时候,*p才会指向其他的内存空间,存放指针变量本身的内存是一直都在的,也就说声明指针变量时系统分配的内存,和指针所指向的内存,是两个不同的概念

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingLife99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值